JNI全称 Java Native Interface,Java本地化接口。主要的作用是为Java层和C/C++ Native层的接口调用提供桥梁。
在Android系统中,NDK将JNI进行了封装,用于在Java层调用native层复杂的算法以及音视频解码等。
https://docs.oracle.com/javase/8/docs/technotes/guides/jni/spec/design.html#jni_interface_functions_and_pointers
和JNI有关的实现包括先要调用LoadLibrary去获取native封装好的JNI库。使用接口时调用public native String stringFromJNI();
这个函数的实现在native层。
package com.example.jni_demo;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
import com.example.jni_demo.databinding.ActivityMainBinding;
public class MainActivity extends AppCompatActivity {
// Used to load the ‘jni_demo’ library on application startup.
static {
System.loadLibrary(“jni_demo”);
}
private ActivityMainBinding binding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = ActivityMainBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
// Example of a call to a native method
TextView tv = binding.sampleText;
tv.setText(stringFromJNI());
}
/**
实现了stringFromJNI在native的逻辑,提供给Java层调用。
#include
#include
extern “C” // 编译时使用C编译器编译,因为JNI内部的实现都是使用C实现的
JNIEXPORT // 表示可以给外部调用,不能省略
jstring // 表示java中的类型
JNICALL // 可以省略,约束函数入栈顺序,和堆栈内存清理的规则
Java_com_example_jni_1demo_MainActivity_stringFromJNI(
JNIEnv* env, // 环境变量,内部包含JNI转调封装结构
jobject /* 表示调用方的一个实例调用,如果是static的java方法,jobject变为jclass,表示是类调用的 */) {
std::string hello = “Hello from C++”;
return env->NewStringUTF(hello.c_str());
}
JNI通过设置对应Java类型的签名传递给Java层数据的类型,否则无法实现转换
boolean — Z
byte — B
char — C
short — S
int — I
long — L
float — F
double — D
void — V
引用类型 – L包名;
https://blog.csdn.net/Love667767/article/details/129740052
https://blog.csdn.net/Love667767/article/details/129729582