一、JNI的作用:
1.使JAVA与本地其他类型语言(C、C++)交互;
2.在JAVA代码里调用C、C++等语言的代码 或 C、C++调用JAVA代码。
由于JAVA具有跨平台的特点,所以JAVA与本地代码的交互能力弱,采用JNI特性可以增强JAVA与本地代码的交互能力。
二、AndroidStudio中JNI的使用方法:
准备工作:
1. 在AndroidStudio里,点击File->Settings...,检查下图中红框圈中的两个工具有没有下载,没有的话需要进行下载:
2. 配置环境:
打开自己的环境配置文件.bashrc,在最后添加如下两行内容:
export ANDROID_NDK=/home/xayf/Android/Sdk/ndk/23.1.7779620
export PATH=$PATH:$ANDROID_NDK
注:加粗、标红部分是NDK在自己系统里安装的位置。
执行source ~/.bashrc,编译环境。
操作方法:
1. 新建一个工程JNITest,在工程的包名下,新建一个JAVA类,类名为JNITest:
package com.example.jnitest;
public class JNITest {
public native String getJNIString();
}
2. 使用javac命令编译JNITest.java文件,生成JNITest.class文件。
在工程目录下~/AndroidStudioProjects/JNITest执行如下命令:javac app/src/main/java/com/example/jnitest/JNITest.java
执行完毕后可以看到包名下面生成了对应的class文件,如下图所示:
3. 生成JNITest.class文件后,需要生成对应的.h文件:
在工程目录下~/AndroidStudioProjects/JNITest执行如下命令:javah -d app/src/main/jni -classpath app/src/main/java/ -jni -v com.example.jnitest.JNITest
执行完毕后可以看到在app/src/main目录下生成了jni目录,目录里生成了对应的.h文件,文件名为com_example_jnitest_JNITest.h
4. 在jni目录下,新建一个cpp文件,命名为JNITest.cpp,文件里实现JNITest.java文件里定义的本地方法:
右击jni->New->C/C++ Source File->输入JNITest
//
// Created by xayf on 2021/11/4.
//
#include
#include
#include
#ifndef _Included_com_example_jnitest_JNITest
#define _Included_com_example_jnitest_JNITest
#ifdef __cplusplus
extern "C" {
#endif
JNIEXPORT jstring JNICALL Java_com_example_jnitest_JNITest_getJNIString
(JNIEnv* env, jobject obj)
{
return env->NewStringUTF("Hello From JNITest Function(getJNIString)");
};
#ifdef __cplusplus
}
#endif
#endif
5. 在jni目录下,再新建一个Android.mk文件:
右击jni目录->New->File->输入Android.mk,在文件里写入如下配置:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := JNITest
LOCAL_SRC_FILES := \
JNITest.cpp \
include $(BUILD_SHARED_LIBRARY)
6. 在终端进入到"~/AndroidStudioProjects/JNITest/app/src/main/jni"目录下,执行ndk-build,执行后在app/src/main目录下自动生成lib文件夹,生成好的so库文件就在lib文件夹下,如下图所示:
7. 建立so库与JAVA文件的关系,在工程的MainActivity活动对应的布局文件activity_main里,添加一个TextView控件:
在MainActivity活动里,添加代码,文件内容如下:
package com.example.jnitest;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
import org.w3c.dom.Text;
public class MainActivity extends AppCompatActivity {
static {
System.loadLibrary("JNITest");
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView textView = (TextView) findViewById(R.id.textview);
JNITest jniTest = new JNITest();
textView.setText(jniTest.getJNIString());
}
}
8. 关键步骤:在Android工程的build.gradle文件里,添加下面的代码:
android {
...
sourceSets {
main() {
jniLibs.srcDirs = ['src/main/libs']
jni.srcDirs = [] //屏蔽掉默认的jni编译生成过程
}
}
}
9. 运行工程到手机,显示画面如下:
图中显示的文字即为cpp文件里定义的方法返回的字符串值。