在Android studio中使用Android.mk方式编译运行,会碰到若干问题,记录下来。
一、Android.mk和c文件写好后的目录如下:
jni.png
这时候编译会出先错误:
Error:Execution failed for task ':app:compileDebugNdk'.
> Error: Your project contains C++ files but it is not using a supported native build system.
Consider using CMake or ndk-build integration. For more information, go to:
https://d.android.com/r/studio-ui/add-native-code.html
Alternatively, you can use the experimental plugin:
https://developer.android.com/r/tools/experimental-plugin.html
解决方法如下:
1 进入改jni目录,使用ndk-build,命令行下编译出so文件.
2 app的build.gradle文件中的buildTypes节点下添加:
sourceSets {
main {
jni.srcDirs = []
}
}
3 有说还需要在工程目录下的gradle.properties文件里添加Android.useDeprecatedNdk=true,不过测试发现可以不用
二、编译成功后,运行会出现错误:
java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.andev.androidmediademo-2/base.apk"],nativeLibraryDirectories=[/data/app/com.andev.androidmediademo-2/lib/x86, /vendor/lib, /system/lib]]] couldn't find "libJNITest.so"
这是因为打包生成apk文件时,没有把so文件打包进去。解决方法如下:
1 app的build.gradle文件中的android节点下添加:
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
这里的节点和编译时的节点不一样。
2 在app目录下建libs文件夹,将so文件copy过去,目录如下:
so.png
三、Cannot determine signature for Surface或Cannot determine signature for Bitmap错误
当向jni层传递Android的类时,使用javah命令需要加上classpath,
如下:
javah -classpath android-sdks/platforms/android-26/android.jar:. com.andev.androidmediademo.PngPreviewController
网友评论