最近在学习《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)
 运行时点击 按钮就会  闪退  在网上找了到很多解决方法,但都没有什么针对性,请哪位能不吝赐教。提前感谢。

解决方案 »

  1.   

    另外  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'
    }
      

  2.   

    您好,想问一下avilib.h怎么配置进去的,我的一直是could not find avilib.h
      

  3.   

    需要在transcode文件夹里面 添加Android.mk文件  在里面描述avilib.h的引用问题。
      

  4.   

    我也配置了Android.mk文件 ,并且把transcode-1.1.7放置到了ndk-bundle 下的sources文件夹下,但是引用不到这个外部模块。(我用的开发工具是Android studio,开发系统是win10系统),是不是由于开发的软件没有配置NDK_MODULE_PATH的功能呢??
      

  5.   

    我也出现这种问题
    java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol "_Z14AVI_frame_sizeP5avi_tl" referenced by "libAVIPlayer.so"...
      

  6.   

    是不是你没把那个avlib.c 编译进去 如果你avlib.c编译到另外一个库的话 你编译的这个库要来连接你这个库