JNI/NDK:CMakeLists.txt 构建so库,导入三方so库
本文使用最新的JNI构建工具CMake完成
通过这篇文章,你讲学习到:
- camke构建自己的三方so库
- 学会使用cmake管理自己jni文件
- 学会使用cmake调用三方的so库
1.CMakeLists.txt 构建so库
- 创建jni的工具类JniUtils :
- 这个类的原本用途是,在工程里用来管理jni的方法,和加载so库用的
- 但是在这里仅仅只是为了加载so库
package com.xjd.myapplication;
public class JniUtils {
static {
//一定要有这一句,否则不会生成so库
System.loadLibrary("goodutil");
}
// public native static String addMethod();
}
- 删除系统的cpp文件;创建自己的cpp文件(goodutil.cpp)和头文件(goodutil.h)
- goodutil.cpp
#include <string>
using namespace std;
string welcome(){
return "欢迎来到我的so库";
}
int add(int a ,int b){
return (a+b)*11;
}
- goodutil.h
#include <string>
using namespace std;
string welcome();
int add(int ,int );
- 配置CMakelist.txt文件,构建goodutil库,两部如下:
cmake_minimum_required(VERSION 3.4.1)
#1.添加自己的so库goodutil
add_library( goodutil
SHARED
src/main/cpp/goodutil.cpp )
find_library( log-lib
log )
#设置so库的输出路径
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/../jniLibs/${ANDROID_ABI})
#2.添加链接
target_link_libraries( goodutil
${log-lib} )
- 设置需要生成的平台,这里只要了一个
- 运行工程,然后就能在build文件夹里找到so库
管理Android工程的jni文件
- 上面的JniUtils.java 在正式的工程中使用如下:包含so库的加载,和本地方法的声明;
- 其中jniutils是由jniutils.cpp构建的so库,jniutils.cpp是按照jni接口的规范写的。
- jniutils.cpp内可以引用三方的so库,三方的库不用安装jni的规范些,因为三方的库是用 jniutils.cpp封装后提供给java调用的
- JniUtils .java可以直接调用,调用是根据(包名_类名_方法)名寻找的
- 其中jniutils是由jniutils.cpp构建的so库,jniutils.cpp是按照jni接口的规范写的。
package com.xjd.ndkt;
public class JniUtils {
static {
System.loadLibrary("jniutils");
// System.loadLibrary("vvw");
}
public static native String getName();
public static native String getvalue(String a,String b);
public static native int add(int a, int b);
public static native int myAdd(int a, int b);
}
- 项目加载自己的so库,可以删掉项目自带的native-lib.cpp,然后自己新创建;也可以吧项目自带的文件内自带的方法删除(自带的方法是关联MainActivity的,我把现在为了统一关联jni方法,要让他关联JniUtils )
- JniUtils.java 和 JniUtils.cpp关系如下图:
- 由图中可知,如果是自己按照jni规则构建的soku(就是JniUtils.cpp),可以直接用JniUtils.java类调用,但是JniUtils.java要放在对应的包下,而且类名还不可以改
- (就是把别人apk解压拿到文件的so库{这个so库本质就是JniUtils.cpp},和别人封装好的调用so库的Java类{这个java类的本质就是JniUtils.java},然后把java类放进类中注明的包中,就可以在工程中通过这个java类调用别人写的so库,但是这样没有文档只能靠猜了,那个美图秀秀的so库就是可以这么用)
- 如果有修改系统自带的native-lib.cpp的名字那么就要配置Cmakelist.text文件,比如本文件修改成了JniUtils.cpp了所以:
- 1.添加自己创建的库
- 2.设置库链接
- 1.添加自己创建的库
导入三方的so库
- 把三方的库放入jniLibs文件夹下
- 添加生成的平台,这里就添加了一个
ndk{
abiFilters 'armeabi-v7a'
}
- 配置 CMakeLists.txt 了,一共4部,如下:
#1.添加三方库(类型时IMPORTED)
add_library( goodutil
SHARED
IMPORTED )
#2.添加库的路径
set_target_properties(
goodutil
PROPERTIES IMPORTED_LOCATION
${CMAKE_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/libgoodutil.so )
#3.添加头文件
include_directories(scr/main/cpp/include/ )
#4.添加链接
target_link_libraries( jniutils
goodutil
${log-lib} )
- 按照 CMakeLists.txt 配置的头文件路径添加三方库的头文件(就是第一步的时候生成的头文件)
- 完成,Shift+F10运行