Android - NDK - CMake - 调用so库

在之前两篇中,有两种方式生成了so库,但.cpp里面并没有写什么内容,体现不出什么来。
不知道怎么生成so库的可以看:
1. Android - NDK - CMake - 生成so库(方式一)
2. Android - NDK - CMake - 生成so库(方式二)
更好体现出怎么去调so库,我们拿(生成so库-方式二)中的项目(Demom_1)来开发吧,有基础的可以直接跟着来。

在这里插入图片描述

1. java

1. Java中new一个java-class(text)----里面内容如图1
	--红色地方,如果按alt+enther(生成对应c函数与头文件)没有的话,在(native-lib.cpp)中手动添加代码
	
2. (这里不做修改也行,这里为了方便看出效果,改动一点)----里面内容如图2
在之前我们先改一处地方,把生成so库原本名称(native-lib)改为(text)
	--在CMakeLists.txt里的 add_library()中改库的名称就好了
	--这个target_link_libraries()相对应链接名称也需要改为(text)
	--在Build ---> Make Project 一下,相对应生成libtext.so
//com.example.demo_1.text
   static{
  		//text:库名称
        System.loadLibrary("text");
    }
    public static native void text();

Android - NDK - CMake - 调用so库_第1张图片
Android - NDK - CMake - 调用so库_第2张图片
在这里插入图片描述

2. native-lib.cpp

#include <jni.h>

//方法名必须为本地方法的全类名点改为下划线,穿入的两个参数必须这样写,
//第一个参数为Java虚拟机的内存地址的二级指针,用于本地方法与java虚拟机在内存中交互
//第二个参数为一个java对象,即是哪个对象调用了这个 c方法
extern "C"
//int: 返回值类型
JNIEXPORT jint JNICALL
Java_com_example_demo_11_text_add(JNIEnv *env, jobject thiz, jint x, jint y) {
    // TODO: implement add()
    int result = x + y;
    return result;
}

在这里插入图片描述

3. JAVA调C

1. text类中增加调用C中的函数add()
2. MainActivity类调用text类中的函数add()

Android - NDK - CMake - 调用so库_第3张图片Android - NDK - CMake - 调用so库_第4张图片在这里插入图片描述

4. 测试代码,生成so库

1. 运行后,打印出:text: --------resu--------- : 95 (表示成功了)
2. 生成so库: -----Build ---> Make Project------
	--生成libtext.so

Android - NDK - CMake - 调用so库_第5张图片Android - NDK - CMake - 调用so库_第6张图片Android - NDK - CMake - 调用so库_第7张图片
在这里插入图片描述

5. 新建另一个项目 (Demo_2)

复制项目(Demo_1)生成的so库到项目(Demo_2)中的libs中(这里的命名不能改)
对应类型,新建对应文件名称,so库对应放(这里就用arm64-v8a)

Android - NDK - CMake - 调用so库_第8张图片
在这里插入图片描述

6. 修改build.gradle

sourceSets {
    main {
        jniLibs.srcDirs = ['libs']
    }
}

Android - NDK - CMake - 调用so库_第9张图片
在这里插入图片描述

7. 新建一个text类

这里要注意的是:路径和相关代码要一样

Android - NDK - CMake - 调用so库_第10张图片
Android - NDK - CMake - 调用so库_第11张图片Android - NDK - CMake - 调用so库_第12张图片
在这里插入图片描述

8. 运行

Android - NDK - CMake - 调用so库_第13张图片

你可能感兴趣的:(so,android,java,java,android)