Android Studio NDK JNI 配置

这个只针对OpenCV的demo,其它的应该也可以,但是mk,c文件什么要自己写。要参考别人。

1.下载NDK

如果已经下载好了,NDK那就有路径,没有那里会有Download的按钮下载。




2. 配置环境变量

打开Terminal执行sudo gedit /etc/profile在最后加上NDKROOT=/home/aaron/Tools/AndroidStudio/android-studio-sdk/android-sdk-linux/ndk-bundle
export PATH=$NDKROOT:$PATH
然后保存退出,刷新下source /etc/profile 打ndk-build看下是否配置成功,不行重启。


3. 设置gradle

这是已经写好的项目,这个是OpenCV的一个Demo,里面已经有写好的mk文件和C++等。



如果直接编译会出错。也有可能出现找不到头文件什么的问题。



修改gradle,

defaultConfig {
    applicationId "org.opencv.samples.facedetect"
    minSdkVersion 8
    targetSdkVersion 8

    ndk {
        moduleName "detection_based_tracker"
    }
}
//取消自动生成,然后手动执行ndk-build
sourceSets.main {
    jni.srcDirs = []
    jniLibs.srcDir 'src/main/libs'
}

自动生成.so有问题,所以加了这个。


这样编译就没问题了,但是运行会crash,提示

12-06 07:59:49.061 11076 11076 E AndroidRuntime: FATAL EXCEPTION: main
12-06 07:59:49.061 11076 11076 E AndroidRuntime: Process: org.opencv.samples.facedetect, PID: 11076
12-06 07:59:49.061 11076 11076 E AndroidRuntime: java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/org.opencv.samples.facedetect-2/base.apk"],nativeLibraryDirectories=[/data/app/org.opencv.samples.facedetect-2/lib/arm64, /vendor/lib64, /system/lib64]]] couldn't find "libdetection_based_tracker.so"

12-06 07:59:49.061 11076 11076 E AndroidRuntime: at java.lang.Runtime.loadLibrary(Runtime.java:367)
12-06 07:59:49.061 11076 11076 E AndroidRuntime: at java.lang.System.loadLibrary(System.java:1076)
12-06 07:59:49.061 11076 11076 E AndroidRuntime: at org.opencv.samples.facedetect.FdActivity$1.onManagerConnected(FdActivity.java:67)
12-06 07:59:49.061 11076 11076 E AndroidRuntime: at org.opencv.android.AsyncServiceHelper$3.onServiceConnected(AsyncServiceHelper.java:319)
12-06 07:59:49.061 11076 11076 E AndroidRuntime: at android.app.LoadedApk$ServiceDispatcher.doConnected(LoadedApk.java:1223)
12-06 07:59:49.061 11076 11076 E AndroidRuntime: at android.app.LoadedApk$ServiceDispatcher$RunConnection.run(LoadedApk.java:1240)
12-06 07:59:49.061 11076 11076 E AndroidRuntime: at android.os.Handler.handleCallback(Handler.java:739)
12-06 07:59:49.061 11076 11076 E AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:95)
12-06 07:59:49.061 11076 11076 E AndroidRuntime: at android.os.Looper.loop(Looper.java:148)
12-06 07:59:49.061 11076 11076 E AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:5417)
12-06 07:59:49.061 11076 11076 E AndroidRuntime: at java.lang.reflect.Method.invoke(Native Method)
12-06 07:59:49.061 11076 11076 E AndroidRuntime: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
12-06 07:59:49.061 11076 11076 E AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
12-06 07:59:49.068  1156  1374 W ActivityManager:   Force finishing activity org.opencv.samples.facedetect/.FdActivity


4. 手动生成.so文件

自己去项目根目录下面执行ndk-build NDK_DEBUG=1 这样就会生成libs文件夹里面就有.so文件。Android Studio项目的里面就会自己刷新这个文件,如果没有自己复制下。注意:如果生成的.so不是arm64-v8a平台就去修改mk文件。找到jni下面的Application.mk文件,然后修改APP_ABI := arm64-v8a


这样程序就可以运行了。



展开阅读全文

没有更多推荐了,返回首页