在Android Studio进行NDK开发,有两种方式:
1 使用已经编译好的.so动态库;
2 使用c/c++源代码开发。
1.1 使用预编译好的.so动态库
用ndk-build工具先编译好.so,然后在Android Studio中引用。
.so存放的路径:
【module name】\src\main\jnilibs\armeabi
如果不想把.so放在上面默认路径,可以在buid.gradle中进行如下配置:
android {
// .. android settings ..
sourceSets.main {
jniLibs.srcDir ‘‘ // <-- 你的.so库的实际路径
}
}
}
1.2 编译C/C++源代码
1.2.1 需要配置NDK的路径;
打开module设置中,设置NDK的路径。
也可以在文件中local.properties中直接设置:
ndk.dir=E:\jni\android-ndk-r10
1.2.2 Gradle配置NDK模块
Build.gradle中配置:
android {
defaultConfig {
ndk{
moduleName "two" //生成的so名字
ldLibs "log", "z", "m" //添加依赖库文件,因为有log打印等
abiFilters "armeabi", "armeabi-v7a", "x86" //输出指定abi体系结构下的so库
}
}
}
当然可以配置更多选项,如下:
ndk {
moduleName “myEpicGameCode”
// Define some macros
cFlags “-DANDROID_NDK -D_DEBUG DNULL=0”
// Link with these libraries
ldLibs “EGL”, “GLESv3”, “dl”, “log”
// Use shared stlport library
stl “stlport_shared” }
}
1.2.3 添加C/C++源代码
默认情况下,你需要把C/C++源代码放在[module]/src/main/jni/路径下。
1.2.4.分平台配置编译(可选)
Build.gradle中配置:
android {
// .. android settings ..
productFlavors {
x86 {
ndk {
abiFilter “x86”
}
}
arm {
ndk {
abiFilter “armeabi-v7a”
}
}
mips {
ndk {
abiFilter “mips”
}
}
}
} // android
1.2.5 错误汇总
报错1:
make.exe: * No rule to make target
解决方案;
在Windows下NDK一个bug,当仅仅编译一个文件时出现会出现此问题,解决方法就是再往jni文件夹加入一个空util.c文件即可
参考:http://blog.csdn.net/sodino/article/details/41946607
报错2:
java.lang.UnsatisfiedLinkError: Couldn’t load from loader dalvik.system.PathClassLoader
解决方案;
在libs文件夹下,新建armeabi-v7a,然后将armeabi下的那些.so文件拷贝过去就行了
参考:http://www.cnblogs.com/freexiaoyu/p/4046431.html
其他方案:http://blog.csdn.net/hj563308597/article/details/50395469(没有验证)
源码:https://github.com/alifeidao/TestNdK