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可以直接调用,调用是根据(包名_类名_方法)名寻找的
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.设置库链接
      在这里插入图片描述

导入三方的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运行

版权声明:本文为hukou6335490原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
THE END
< <上一篇
下一篇>>