• JNI 初级接触


    什么是JNI?

    JNI(Java Native Interface),(JNI) 标准是java 平台的一部分,它允许Java 代码和其他语言写的代码进行交互。JNI 是本地编程接口,它使得在 Java 虚拟机 (VM) 内部运行的 Java 代码能够与用其它编程语言( 如 C 、C++ 和汇编语言) 编写的应用程序和库进行交互操作。

    Andoird 中使用了一种不同传统Java JNI 的方式来定义其native 的函数。
    其中很重要的区别是Andorid 使用了一种Java 和 C 函数的映射表数组,并在其中描述了函数的参数和返回值。这个数组的类型是JNINativeMethod,定义如下:

    typedef struct {
      const char* name; /*Java 中函数的名字*/
      const char* signature; /* 描述了函数的参数和返回值*/
      void* fnPtr; /* 函数指针,指向C 函数*/
    } JNINativeMethod;
    
    • 1
    • 2
    • 3
    • 4
    • 5

    Signature说明:
    例子:

    --"()V"
    --"(II)V"
    --"(Ljava/lang/String;Ljava/lang/String;)V"
    
    • 1
    • 2
    • 3

    说明:

    --"()" 中的字符表示参数,后面的则代表返回值。例如"()V" 就表示void Func();
    --"(II)V" 表示 void Func(int, int);
    --"(Ljava/lang/String;Ljava/lang/String;)V“ 表示void Func(String, String);
    
    • 1
    • 2
    • 3

    在java中用native语句声明,调用规定格式写成的函数名。

    CMakeLists.txt

    cmake_minimum_required(VERSION 3.18.1) # CMake 的最低版本
    project("myapplication")	#项目名称
    
    add_library( 
               		myapplication
                 SHARED
                 myapplication.cpp )
                           
     find_library( 
                  log-lib
                  log )
                  
    target_link_libraries( 
                           myapplication
                           ${log-lib} )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    myapplication.cpp:

    #include<jni.h>
    
    extern "C"
    JNIEXPORT jint JNICALL
    Java_com_example_myapplication_MainActivity_catTest(JNIEnv *env, jobject thiz) {
        // TODO: implement cat_test()
        std::cout<<"test function__"<<std::endl;
            return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    JNIWXPORT:在Jni编程中所有本地语言实现Jni接口的方法前面都有一个"JNIEXPORT",这个可以看做是Jni的一个标志.

    JNICALL :这个可以理解为Jni 和Call两个部分,和起来的意思就是 Jni调用XXX(后面的XXX就是JAVA的方法名)。

    Java_com_example_myapplication_MainActivity_catTest:这个就是被上一步中被调用的部分,也就是Java中的native 方法名,这里起名字的方式比较特别,是:包名+类名+方法名。

    JNIEnv* env:这个env可以看做是Jni接口本身的一个对象,jni.h头文件中存在着大量被封装好的函数,这些函数也是Jni编程中经常被使用到的,要想调用这些函数就需要使用JNIEnv这个对象。例如:env->GetObjectClass()。(详情请查看jni.h)

    jobject thiz:代表着native方法的调用者,本例即new NativeDemo();但如果native是静态的,那就是NativeDemo.class

    MainActivity:

    package com.example.myapplication;
    
    import androidx.appcompat.app.AppCompatActivity;
    
    import android.os.Bundle;
    
    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            catTest();
        }
        static{
            System.loadLibrary("myapplication"); //加载C++生成动态库
        }
        
        public native int catTest();//调用C++代码
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
  • 相关阅读:
    浅谈数据仓库架构设计
    【Crypto | CTF】BugKu 简单的RSA
    VueX插件、持久化存储、分包module模块vuex
    查看自己显卡支持的最高CUDA版本,和已安装的CUDA版本
    PyTorch框架中torch、torchvision、torchaudio与python之间的版本对应关系(9月最新版)
    音频——I2S 标准模式(二)
    数据治理项目成功的要点,企业培养数据要把握好关键环节
    还不会小程序开发?适用于新手、前端、后端、全栈的小程序开发保姆级教程!
    springboot采用协同过滤算法的家政服务平台的设计与实现毕业设计源码260839
    力扣代码学习日记五
  • 原文地址:https://blog.csdn.net/weixin_52270223/article/details/125594215