我们上篇中主要讲了怎么去打包so库
C++编写、生成、调用so库详解(一)
这篇我们就来说一些怎么调用so库
目录
1.调用符合JNI标准的so库
2.调用不符合JNI标准的so库
上面说了两种不同类型的so库,我们分别来看一下怎么调用这两种,在调用so库之前,我们先说一下直接调用上面写的C++代码,
符合JNI标准的so库,就是我们上一篇中提到的,写起来麻烦,调用起来方便的so库,
调用这个库需要知道包含本地方法的包名和名还有方法名,要不然不好调用.
我这边为了区分开,就新建了一个普通的Android项目,首先将so库复制进来
放在app->libs目录下,没有目录就新建一个目录
然后打开app的build.gradle文件,注意是app的,不是project的
在android节点下新加以下代码,注意不要加错节点
android {
...
defaultConfig {
...
}
sourceSets {
main {
jni.srcDirs = []
jniLibs.srcDirs = ['libs']
}
}
}
然后新建一个Java文件,对应我们前面说到写了一个native-lib的文件,里面对应了一个Java的文件,
我们这边就新建一个Java类
这边注意看圈红的地方,全都是上文中第5条里提到的注意点,一个字母都不能错,我这边的包名和类目都是前面一篇中指定的,各位要替换成自己的
然后就可以直接调用啦
能看到我这边已经调用成功了.
这类库就是在编写so库的时候,没有将JNI写到so库中,这时候我们就需要在外面自己写JNI了,
调用这类so库需要用到两种文件,一个是so库,还有一个就是so库对应的头文件,
这个写起来就比较麻烦了,
放在app->libs目录下,没有目录就新建一个目录
然后新建cpp目录,如下
可以看到,这边我还新建了一个include文件夹,中间放的是头文件,就是上文中提到的so库对应的头文件,然后新建CMakeLists.txt和native-lib.cpp文件,CMakeLists.txt中我们需要改一下
include_directories是指定我们刚刚复制进来的头文件的路径,
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -L${CMAKE_SOURCE_DIR}/../../../libs/${CMAKE_ANDROID_ARCH_ABI}")就是链接到我们刚刚的libs下面的so库,
target_link_libraries中最后添加我们的so库名字,加到最后,顺序是有规则的.
可以看到和我们上一篇中写的JNI几乎一样,
打开app的build.gradle文件,注意是app的,不是project的
添加几个配置节点
android {
...
defaultConfig {
...
externalNativeBuild {
cmake {
arguments "-DANDROID_STL=c++_shared"
}
ndk {
abiFilters "arm64-v8a", "armeabi-v7a", "x86", "x86_64"
}
}
}
sourceSets {
main {
jni.srcDirs = []
jniLibs.srcDirs = ['libs']
}
}
externalNativeBuild {
cmake {
path file('src/main/cpp/CMakeLists.txt')
version '3.22.1'
}
}
...
}
注意,这边有个容易犯错的地方,就是System.loadLibrary,不再是加载sodemo那个库,而是加载我们刚刚写的这个JNI的库,库名字就是CMakeLists.txt中的project("sodemo2"),各位要换成自己的库名字
可以看到,我这边已经调用成功了.
至此so库的打包和调用都讲完了,如果有不对的地方希望大家指出来...