序言:该篇文章记录Android studio怎么使用NDK制作so库过程
最开始用Android Studio 3点几的版本和2020年3月份最新版本的Android studio,配置的时候老是出一些无法解决的错误,搞的心态爆炸。最终选择Android 4.0版本
SDK Platforms:Android 6.0(API 23)
SDK Build-Tools: 27.0.3
NDK 版本:21.0.6113669
一. 配置NDK环境
(1)点击1处进行NDK下载,勾选3处可以查看NDK的具体版本号
(2)NDK下载后的位置
SDK位置在:D:\AS\SDK
NDK位置在:D:\AS\SDK\ndk,我这里下载21.0.6113669
(3)配置环境变量
a. 打开电脑控制面板---->系统和安全---->系统---->高级系统设置---->环境变量
b.在系统变量里点击新建,创建一个NDK的环境变量
变量名就自己定义了,我这里定义为NDK_PATH,变量值为NDK的下载路径
注意:NDK的路径为含有build等文件的根目录,另外,如果可能还存在版本的问题,最开始配置23这个版本,NDK配置还是失败。
c.配置Path变量,新建一个变量值,增加%NDK_PATH%
d.在cmd下输入ndk-build,说明ndk环境配置成功
二. Android studio下制作so库过程
1.AS下新建一个TEST工程,在创建后的工程下创建一个JNI类
JNI.java里内容(JNI类里包含一个返回类型为String类型的sayHello方法)
package com.example.test;
public class JNI {
public static native String sayHello();
}
2.在main文件夹下创建一个jni文件夹,jni文件夹下包含一个Android.mk,一个头文件,和一个C源文件
3. 制作jni文件夹下的头文件
(1)点击Android studio File---->Settings---->Tools----->External Tools
(2)创建一个Javah的快捷工具
Program: javah
Arguments: -v -jni -d D:\AS\WORK\TEST\app\src\main\jni $FileClass$ //这里的路径指头文件的存放位置
Working directory: $SourcepathEntry$
(3)右击JNI.java这个文件,选择External Tools下的javah,会自动生成com_example_test_JNI.h
(4)自己在jni文件夹下创建一个c文件(我取名为jni.c),文件里的内容如下
#include "jni.h"
#include "com_example_test_JNI.h"
JNIEXPORT jstring JNICALL Java_com_example_test_JNI_sayHello(JNIEnv* env,jclass object){
return (*env)->NewStringUTF(env,"测试 jni");
}
(5)在jni文件夹下创建Android.mk文件,文件内容如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
#so库的名称
LOCAL_MODULE := JNITest
#需要用到的原材料
LOCAL_SRC_FILES := jni.c
include $(BUILD_SHARED_LIBRARY)
4.配置build.gradle,在该文件下加上ndk这段内容
defaultConfig {
applicationId "com.example.test"
minSdkVersion 23
targetSdkVersion 31
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
ndk{
moduleName "JNITest"
abiFilters "armeabi","armeabi-v7a","x86"
}
}
5.生成so库文件,在Android studio下打开Terminal,进入jni文件夹下,输入ndk-build,会在app->src->main->obj->local下生成so库文件
6.在main文件夹下创建jniLibs文件夹,将编译生成的.so库armeabi-v7a整个文件夹拷贝到jniLibs文件下
7.在java里调用.so文件
JNI.class包含so库
package com.example.test;
public class JNI {
static{
System.loadLibrary("JNITest");
}
public native String sayHello();
}
MainActivity里调用sayHello函数
public class MainActivity extends AppCompatActivity {
private TextView text;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
text = findViewById(R.id.test);
text.setText(new JNI().sayHello());
}
}
结果: