• JNI 概述


    概述

    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

    JNIDemo

    Java侧代码

    和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());
    }

    /**

    • A native method that is implemented by the ‘jni_demo’ native library,
    • which is packaged with this application.
      */
      public native String stringFromJNI();
      }

    c++侧代码

    实现了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包名;

    JNI的静态和动态注册

    https://blog.csdn.net/Love667767/article/details/129740052

    JNI的数据结构

    https://blog.csdn.net/Love667767/article/details/129729582

  • 相关阅读:
    Hyperspectral Imagery Classification Based on Contrastive Learning
    SpringBoot 项目实战 ~ 5.菜品管理
    02_udp编程
    Mac装虚拟机好不好 Mac装虚拟机和装Windows系统一样吗 PD虚拟机
    SIEM(安全信息和事件管理)解决方案
    FlinkSQL ChangeLog
    Spring mvc处理异常
    【分享】小红书采集图片下载到本地
    计算/存储虚拟化高级特性
    webpack 面试题
  • 原文地址:https://blog.csdn.net/weixin_34764432/article/details/133838188