摘要
安卓漏挖第4步,学会编写so文件。
环境配置
确定安装了ndk, cmake.
下载NDK: 在 file->settings->System Settings->Android SDK->SDK Tools中检查NDK是否下载,如果没有就需要下载并配置一下,除了需要NDK之外,还需要下载CMake这个编译工具。
安装ndk的时候有个坑,我解压完有两层目录,所以报错找不到配置文件。所以需要注意解压完,进入目录里看一下。如果报错了,就根据报错信息检查代码,一般是代码有一些失误。
新建项目的时候, 记得选择 Native C++
等待新建项目完成,会报错找不到ndk,所以我们配置一下
在Android视图下, 打开local.properties,加上ndk的路径
声明native方法
新建一个类, 声明native方法. 这个类是java与C/C++交互的中介, 方法由java声明, 由C/C++实现
这里为了方便接下来的操作, 切换成Project视图
myJNI.java
myJNI.java
package com.example.a04;
public class myJNI {
static {
System.loadLibrary("JniTest");
}
public static native String sayHello();
}
编译与头文件的生成
使用javac编译上述文件, 生成class文件
myJNI类所在的目录,右键在终端打开。
javac myJNI.java
确认自己的包名和类名。然后在java目录使用 javah -jni 包名.类名 命令生成.h头文件。注意一定要在java层目录下输入命令,不然会报错:找不到xxx类
javah -jni com.example.a04.myJNI
我java版本是1.8,如果是java11,用法应该是
javac -h .\ myJNI.java
将生成的com_example_test_myJNI.h拖到cpp目录下
然后删掉原来cpp目录下的native-lib.cpp
实现头文件的函数
在cpp目录下新建main.c
main.c中的内容, 首先是将头文件包括进来, 然后实现头文件中的sayHello方法
#include "com_example_a04_myJNI.h"
JNIEXPORT jstring JNICALL Java_com_example_a04_myJNI_sayHello
(JNIEnv *env, jclass jobj) {
return (*env)->NewStringUTF(env, "hello zjj!");
}
由于我们使用CMake来生成so的, 所以要修改CMakeLists.txt来指定so名称和so的源文件的相对路径
然后,sync一下
生成so库
Build->Rebuild Project来生成so库
生成的so在app\build\intermediates\cmake\debug\obj\
配置so库
在app/src/main下新建jniLIB目录,并将生成的SO文件拷贝到该文件夹下
调用
打开MainActivity插入一条log来调用so中的sayHello方法,并连接手机调试
package com.example.a04;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
import com.example.a04.databinding.ActivityMainBinding;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.i("开始调用so中的方法",myJNI.sayHello());
}
}
参考链接
https://blog.csdn.net/A807296772/article/details/102298970