Android JNI开发
一、下载配置环境
1、首先下载配置android studio ndk,然后在android studio中配置ndk环境,如下图所示(setting-Android SDK-SDK Tools)
二、新建项目
1、新建一个名为MyNDKDemo的android项目
2、首先在app底下配置gradle
sourceSets.main {
jni.srcDirs = []
jniLibs.srcDirs = ['src/main/jniLibs']//设置目标的so存放路径
}
task ndkBuild(type: Exec, description: 'Compile JNI source via NDK') {
commandLine "D:\\Android\\sdk\\ndk-bundle\\ndk-build.cmd",
//配置ndk的路径
'NDK_PROJECT_PATH=build/intermediates/ndk',
//ndk默认的生成so的文件
'NDK_LIBS_OUT=src/main/jniLibs',
//配置的我们想要生成的so文件所在的位置
'APP_BUILD_SCRIPT=src/main/jni/Android.mk',
//指定项目以这个mk的方式
'NDK_APPLOCATION_MK=src/main/jni/Application.mk'
}
//指定项目以这个mk的方式
tasks.withType(JavaCompile) {
//使用ndkBuild
compileTask -> compileTask.dependsOn ndkBuild
}
3、新建JNI类,在JNI类中随便定义一个本地方法
package com.ljs.jnidemo;
/**
* author : Ben
* e-mail : ben-lau@auratech.hk
* time : 2019/12/9
* desc :
* version: 1.0
*/
public class JNI {
static {
System.loadLibrary("jni_demo");
}
public native int getInt();
}
4、生成头文件
当然可以通过命令行的方式,javah -jni 之类的,但是android studio已经简化这个工作了,配置一下,只需要右键生成.h文件即可。配置工作本质上也是调用javah命令。打开android studio的设置窗口,选择External Tools -> 新建(那个绿色+号)
配置好我们自定义的工具之后,找到对应的java类,右击,选择External Tools下的javah -jni后,将生成.h的头文件,头文件在我们项目main目录下的jni文件夹中。
5、我们在jni文件夹下新建.c文件,用来实现对应的本地方法,c文件的名称为jni
#include <stdio.h>
#include <com_ljs_jnidemo_JNI.h>
java_com_ljs_jnidemo_JNI_getInt(JNIEnv *env,jobject jobj){
return 23;
}
6、在jni文件夹下新建两个mk文件,分别为Application.mk和Android.mk
Application.mk
APP_ABI:=all
Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := jni_demo
LOCAL_SRC_FILES := jni.c
include $(BUILD_SHARED_LIBRARY)
7、到这里基本上我们已经完成了jni的开发,然后我们rebuild一下整个工程,so文件就会生成,生成的so文件如下图所示
8、最后我们在MainActivity中调用JNI里面的方法,然后将获取到的值显示在TextView控件上
package com.ljs.jnidemo;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
private TextView tv_text;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv_text = findViewById(R.id.tv_text);
JNI jni = new JNI();
tv_text.setText("" + jni.getInt());
}
}