最近在学习《pre AndroidC++ with NDK》这本书 学习ndk使用,但是学习 原生图型API 时 ndk-build 编译可以正常进行,run之后点击按钮后就会crash 闪退掉(实例的功能是按钮之后播放一段视频),找了好几天的问题不知道怎么回事,特来此请教,还请不吝赐教啊。
详细如下 Amdroid.mk 文件内容如下LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE := AVILibPlayerT2LOCAL_SRC_FILES := \
Common.cpp \
com_example_avilibplayert2_AbstractPlayerActivity.cpp \
com_example_avilibplayert2_BitmapPlayerActivity.cppLOCAL_STATIC_LIBRARIES += avilib_static
LOCAL_LDLIBS += -ljnigraphics
LOCAL_ALLOW_UNDEFINED_SYMBOLS := true
include $(BUILD_SHARED_LIBRARY)$(call import-module,transcode-1.1.7/avilib)模块下的目录如下:在transcode-1.1.7/avilib中的Android.mk文件内容如下:(就是这个位置)LOCAL_PATH:=$(call my-dir)
#
#转码AVILib
##源文件
MY_ABILIB_SRC_FILES:= avilib.c platform_posix.c#包含导出路径
MY_AVILIB_C_INCLUDES := $(LOCAL_PATH)#
#AVILib静态
#
include $(CLEAR_VARS)#模块名称
LOCAL_MODULE := avilib_static#源文件
LOCAL_SRC_FILES := $(MY_AVILIB_SRC_FILES)#包含导入路径
LOCAL_EXPORT_C_INCLUDES := $(MY_AVILIB_C_INCLUDES)#构建静态库
include $(BUILD_STATIC_LIBRARY)#
#AVILib共享
#include $(CLEAR_VARS)#模块名称
LOCAL_MODULE := avilib_shared#源文件
LOCAL_SRC_FILES := $(MY_AVILIB_SRC_FILES)#包含导出路径
LOCAL_EXPORT_C_INCLUDES := $(MY_AVILIB_C_INCLUDES)#构建共享库
include $(BUILD_SHARED_LIBRARY)
报错当中的AVI_video_getheight()是 avilib.c文件中的。是通过 com_example_avilibplayert2_AbstractPlayerActivity.cpp中调用的。如下:而且里面加载了 包含AVI_video_getheight()的 头文件:
jint Java_com_example_avilibplayert2_AbstractPlayerActivity_getHeight
(JNIEnv * env, jclass clazz, jlong avi){
return AVI_video_height((avi_t*)avi);
}12-18 13:17:51.863 17958-17958/com.example.avilibplayert2 E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.avilibplayert2, PID: 17958
java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol "AVI_video_height" referenced by "/data/app/com.example.avilibplayert2-1/lib/arm64/libAVILibPlayerT2.so"...
at java.lang.Runtime.loadLibrary(Runtime.java:384)
at java.lang.System.loadLibrary(System.java:1086)
at com.example.avilibplayert2.AbstractPlayerActivity.<clinit>(AbstractPlayerActivity.java:51)
at java.lang.Class.newInstance(Native Method)
at android.app.Instrumentation.newActivity(Instrumentation.java:1070)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2349)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2511)
at android.app.ActivityThread.access$900(ActivityThread.java:165)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1375)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:150)
at android.app.ActivityThread.main(ActivityThread.java:5621)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:794)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:684)
运行时点击 按钮就会 闪退 在网上找了到很多解决方法,但都没有什么针对性,请哪位能不吝赐教。提前感谢。
详细如下 Amdroid.mk 文件内容如下LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE := AVILibPlayerT2LOCAL_SRC_FILES := \
Common.cpp \
com_example_avilibplayert2_AbstractPlayerActivity.cpp \
com_example_avilibplayert2_BitmapPlayerActivity.cppLOCAL_STATIC_LIBRARIES += avilib_static
LOCAL_LDLIBS += -ljnigraphics
LOCAL_ALLOW_UNDEFINED_SYMBOLS := true
include $(BUILD_SHARED_LIBRARY)$(call import-module,transcode-1.1.7/avilib)模块下的目录如下:在transcode-1.1.7/avilib中的Android.mk文件内容如下:(就是这个位置)LOCAL_PATH:=$(call my-dir)
#
#转码AVILib
##源文件
MY_ABILIB_SRC_FILES:= avilib.c platform_posix.c#包含导出路径
MY_AVILIB_C_INCLUDES := $(LOCAL_PATH)#
#AVILib静态
#
include $(CLEAR_VARS)#模块名称
LOCAL_MODULE := avilib_static#源文件
LOCAL_SRC_FILES := $(MY_AVILIB_SRC_FILES)#包含导入路径
LOCAL_EXPORT_C_INCLUDES := $(MY_AVILIB_C_INCLUDES)#构建静态库
include $(BUILD_STATIC_LIBRARY)#
#AVILib共享
#include $(CLEAR_VARS)#模块名称
LOCAL_MODULE := avilib_shared#源文件
LOCAL_SRC_FILES := $(MY_AVILIB_SRC_FILES)#包含导出路径
LOCAL_EXPORT_C_INCLUDES := $(MY_AVILIB_C_INCLUDES)#构建共享库
include $(BUILD_SHARED_LIBRARY)
报错当中的AVI_video_getheight()是 avilib.c文件中的。是通过 com_example_avilibplayert2_AbstractPlayerActivity.cpp中调用的。如下:而且里面加载了 包含AVI_video_getheight()的 头文件:
jint Java_com_example_avilibplayert2_AbstractPlayerActivity_getHeight
(JNIEnv * env, jclass clazz, jlong avi){
return AVI_video_height((avi_t*)avi);
}12-18 13:17:51.863 17958-17958/com.example.avilibplayert2 E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.avilibplayert2, PID: 17958
java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol "AVI_video_height" referenced by "/data/app/com.example.avilibplayert2-1/lib/arm64/libAVILibPlayerT2.so"...
at java.lang.Runtime.loadLibrary(Runtime.java:384)
at java.lang.System.loadLibrary(System.java:1086)
at com.example.avilibplayert2.AbstractPlayerActivity.<clinit>(AbstractPlayerActivity.java:51)
at java.lang.Class.newInstance(Native Method)
at android.app.Instrumentation.newActivity(Instrumentation.java:1070)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2349)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2511)
at android.app.ActivityThread.access$900(ActivityThread.java:165)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1375)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:150)
at android.app.ActivityThread.main(ActivityThread.java:5621)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:794)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:684)
运行时点击 按钮就会 闪退 在网上找了到很多解决方法,但都没有什么针对性,请哪位能不吝赐教。提前感谢。
apply plugin: 'com.android.application'android {
compileSdkVersion 25
buildToolsVersion '25.0.0'
defaultConfig {
applicationId "com.example.avilibplayert2"
minSdkVersion 19
targetSdkVersion 23
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" }
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
sourceSets.main.jni.srcDirs = []
//禁止自带的ndk功能
sourceSets.main.jniLibs.srcDirs = ['src/main/libs','src/main/jniLibs'] // <-- 你的.so库的实际路径
}dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:26.+'
compile 'com.android.support.constraint:constraint-layout:1.0.2'
testCompile 'junit:junit:4.12'
}
java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol "_Z14AVI_frame_sizeP5avi_tl" referenced by "libAVIPlayer.so"...