• 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

  • 相关阅读:
    算法日记-02完全背包和多重背包问题总结
    机器学习/人工智能的笔试面试题目——PCA降维相关问题总结
    怎样才能在网上快速赚到钱?
    基于HPC场景的集群管理系统(slurm系统初相识)
    Hystrix 请求合并、请求隔离、优化
    驱动开发:内核LDE64引擎计算汇编长度
    2311vim极语言加高亮
    【PAT乙级】1024 科学计数法
    【数据结构与算法】杨辉三角,相同字符的截取以及扑克牌
    jni-03、CMakeLists、gradle配置
  • 原文地址:https://blog.csdn.net/weixin_34764432/article/details/133838188