完整问题为:
```
dlopen failed: cannot locate symbol "AVI_video_height" referenced by "/data/app/com.example.avilibplayert2-1/lib/arm64/libAVILibPlayerT2.so"
```
最近在学习《pre AndroidC++ with NDK》这本书 学习ndk使用,但是学习 原生图型API 时 ndk-build 编译可以正常进行,run之后点击按钮后就会crash 闪退掉(实例的功能是按钮之后播放一段视频),找了好几天的问题不知道怎么回事,特来此请教,还请不吝赐教啊。
详细如下
Android.mk
```
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := AVILibPlayerT2
LOCAL_SRC_FILES := \
Common.cpp \
com_example_avilibplayert2_AbstractPlayerActivity.cpp \
com_example_avilibplayert2_BitmapPlayerActivity.cpp
LOCAL_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的目录如下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)
```
另:我的build.gradle文件:
```
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'
}
```
测试机Android 6.0 API 23 真机非模拟器
运行时点击 按钮就会 闪退,不清楚为何。ndk开发学习刚刚入门阶段,还请了解情况的大佬不吝赐教。
这是我在提问者 要提交的 提问内容。是关于Android NDK的 没什么 不适当的言论那。而且C币都扣掉了,能解禁么?还有,是与不是,请回复我一下啊,要是哪里不合适我改掉就行了。我是非常非常非常着急的。