1、给 Android Studio 配置 NDK
File-Project Structure-SDK Location
点击最下面的DownLoad按钮
下载好之后as会自动将ndk加载到项目中,默认情况下ndk下载到了sdk所在的目录下,如下图所示
下载完成时候也可以通过local.properties文件查看sdk和ndk在电脑上的保存路径,local.properties文件的内容如下:
2、创建一个 JNITest.java 的一个类
public class JNITest {
public native static String get();
}
3、创建 .h 的头文件
打开Terminal,输入以下命令
cd app/src/main/java
javah -d ../jni com.xx.myapplication.JNITest
第一行命令就是先进入当前项目的app/src/main/java
路径下
重点介绍下第二行命令。要生成Java类对应的头文件我们就必须要用到javah
这个命令,其次-d
表示生成一个目录。生成目录路径就是后面的../jni
。../
表示在当前目录的上一层目录,也就是main
目录了。而jni
就表示我们生成的目录的名称。所以第二行命令的作用就是在main
目录下生成JNITest类所对应的头文件
进入头文件中,代码是如下这个样子:
4、编写C/C++代码
在jni目录下创建test.c文件,实现头文件中的方法
#include<jni.h>
#include<stdio.h>
//导入我们创建的头文件
#include "com_xx_myapplication_JNITest.h"
JNIEXPORT jstring JNICALL Java_com_xx_myapplication_JNITest_get
(JNIEnv *env, jclass jclass){
//返回一个字符串
return (*env)->NewStringUTF(env,"This is my first NDK Application");
}
其中第一个注意的地方是导入我们的头文件这里,改为你自己的文件名称
第二个就是第二个画方框的地方代码是从头文件里复制过来的,就是下面的参数变了
5、创建Android.mk、Application.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := JNITest
LOCAL_SRC_FILES := test.c
# for logging
LOCAL_LDLIBS += -llog
include $(BUILD_SHARED_LIBRARY)
Android.mk文件中的LOCAL_MODULE :=JNITest指定的是生成动态库的名字,LOCAL_SRC_FILES :=test.c关联的是jni目录下的.c文件
APP_ABI := all
Application.mk:APP_ABI就是abiFilters了,所以之前我们做的配置都可以在这里写,赋值为all表明全平台生成,如果有多个用空格分开
6、编译配置
配置好后,build.gradle增加了如下代码
7、JNITest文件加载动态库
public class JNITest {
static {
System.loadLibrary("JNITest");
}
public native static String get();
}
7、使用
MainActivity
public class MainActivity extends AppCompatActivity {
private Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(MainActivity.this,JNITest.get(),Toast.LENGTH_SHORT).show();
}
});
}
}
activity_main
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:orientation="vertical"
android:gravity="center">
<Button
android:id="@+id/button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="button"/>
</LinearLayout>
效果图:
https://blog.csdn.net/young_time/article/details/80346631
https://blog.csdn.net/Hi_Red_Beetle/article/details/78994767
https://blog.csdn.net/yao_94/article/details/79151804
https://blog.csdn.net/u011339364/article/details/83377591