前言
我会在小专栏和简书一起分享。
约定写一篇如何生成多个so文件,要做ndk开发肯定会涉及到生成多个so文件,此次我会将cmake和ndk-build两种编译方式一起写,东西不多,一起学习吧。
正题
CMake编译
首先想之前一样新建一个空项目,记得勾选Include C++ support
。这是一个最简单的CMake编译so的项目。接着新建一个PlusJni.java
类,在cpp
目录下新建一个C++
文件,我命名为native-plus-lib.cpp
。可以通过自动创建C++方法的方法。
public class PlusJni {
static {
System.loadLibrary("native-plus-lib");
}
public native int plusNumbers(int x,int y);
}
#include <jni.h>
extern "C"
JNIEXPORT jint JNICALL
Java_com_crayfish_cmakehello_PlusJni_plusNumbers(JNIEnv *env, jobject instance, jint x, jint y) {
return x+y;
}
这是一个简单的加法运算。然后我们在CMakeLists.txt
文件中,补充以下代码
add_library(native-plus-lib SHARED
src/main/cpp/native-plus-lib.cpp)
最后点击build
->Make Module 'app'
编译项目,就可以在cmake
目录下的so文件了
这里只有一个
armeabi
文件夹是因为我在app
->build.gradle
文件中配置了
externalNativeBuild {
cmake {
cppFlags ""
// abiFilters 'armeabi','x86','armeabi-v7a','arm64-v8a','x86','x86_64','mips','mips64' //根据需要可选一个或多个
abiFilters 'armeabi'
}
}
ndk-build编译
我们在第一个项目基础上同样新建PlusJni.java
,接着使用之前建的Tools
,DNK
->javah
生成头文件。然后也新建native-plus-lib.cpp
,重复代码就不贴了,最关键的就是Android.mk
文件的编写,在最后新增这么一段。
include $(CLEAR_VARS)
LOCAL_MODULE := PlusJni //so名称
LOCAL_SRC_FILES := native-plus-lib.cpp//编译的cpp文件
include $(BUILD_SHARED_LIBRARY)
最后使用NDK
->ndk-build
就会生成多个so文件了。
同样我们也可以在
Application.mk
文件中设置APP_ABI := armeabi
。这样就可以只编译armeabi
文件夹了。
结尾
生成多个so文件其实很简单,要想学好ndk开发,那么最好的质料就是官方了,在github
上有android-ndk项目可以多参考。