Androidstudio下jni的一些问题
android NDK 支持纯jni的方式构建app
此处是AndroidStudio下构建jni程序方法,通用
成功运行程序后,可以逐渐接触jni代码了。和熟悉AndroidStudio的过程一样,对工具的使用都是一个慢慢累积的过程。
试着将NDK android-ndk-r10e\samples下的代码在androidstudio下跑,果然没那么顺利。
运行的是native-activity这个项目,遇到了如下错误:
F:\androidstudio\JNIActivity\app\src\main\jni\main.c
Error:(27, 37) android_native_app_glue.h: No such file or directory
compilation terminated.
make.exe: *** [F:\androidstudio\JNIActivity\app\build\intermediates\ndk\debug\obj/local/arm64-v8a/objs/jniLibs/F_\androidstudio\JNIActivity\app\src\main\jni\main.o] Error 1
Error:Execution failed for task ':app:compileDebugNdk'.
> com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command 'F:\BaiduYunDownload\android-ndk-r10e\ndk-build.cmd'' finished with non-zero exit value 2
Information:BUILD FAILED
Information:Total time: 0.89 secs
Information:2 errors
Information:0 warnings
Information:See complete output in console
网上大部分都是说在Android.mk文件里少了
include $(BUILD_SHARED_LIBRARY)
$(call import-module,android/native_app_glue)
但我是拷贝的文件里面是有的,并且在已经通过编译的项目中加上上述依赖并引用该库依然没有通过编译。
所以要找突破口
1.Android.mk是Android提供的一种makefile文件,多个模块的项目每个目录中定义对应的Android.mk文件(类似于上面的写法),
最后,在根目录放置一个Android.mk文件,需要先明白里面变量的意义:Android.mk释义
后来绕过来了Android.mk是eclipse下组织编译JNI的文件,而studio使用gradle来组织编译的
在项目下的build.gradle文件中
android {
defaultConfig {
ndk {
moduleName "jniLibs" // 生成so文件的名字
ldLibs "EGL", "GLESv3", "dl", "log" // Link with these libraries!
stl "stlport_shared" // Use shared stlport library
}
}
}
即是用来编译的设置,之前在android.mk下的设置并没有起到相应的作用,现在要做的就是如何将引用的外部库添加到这个位置。
暂时没有想到对应方法。
最后可以手动编译出.so文件供程序调用。
然后运行成功了。
总结:
当前我运行jni没有通过gradle中的设置实现全自动的编译打包
还是要切换到jni的目录下先运行ndk-build命令生成so动态库,当然前提是先把ndk-build命令添加到path路径中去会方便些。
在androidstudio的配置文件中需要加3个地方
1.gradle.properties中添加
android.useDeprecatedNdk=true
2.module下的build.gradle下添加两处代码
android {
defaultConfig {
ndk {
moduleName "jniLibs" // 1.生成so文件的名字,和system.loadlibrary引入的名字相同
}
}
//2.定义jni的so文件的存放目录,缺的话生成so文件程序也找不到
sourceSets.main {
jni.srcDirs = [] // This prevents the auto generation of Android.mk
// sourceSets.main.jni.srcDirs = []
jniLibs.srcDir 'src/main/libs' // This is not necessary unless you have precompiled libraries in your project.
}
}