• JNI的简单使用(Eclipse)


    1. JNI的基本介绍

    JNI: Java Native Interface, Java本地接口,使得Java程序可以调用C++程序

    类型转换:
    在这里插入图片描述

    在这里插入图片描述

    方法签名:
    在这里插入图片描述

    数据类型及对应字符:
    在这里插入图片描述

    图片来源

    2. 简单使用

    1. 在eclipse中创建一个项目,建立一个包,创建一个JNI测试类,项目结构如下:
    在这里插入图片描述

    package jni;
    
    public class JNITest {
    	 static {
    	        System.load("D:\\eclipse_java\\SGXDemo\\src\\JNIDll.dll");
    		 //System.loadLibrary("JNIDll");
    	    }
    	 
    	    public static void main(String[] args) {
    	      
    	        JNITest jniTest = new JNITest();
    	        jniTest.javaCallNative();	 
    	        int sum=jniTest.nativeAdd(1,2);
    	        System.out.println("sum= "+sum);
    	 
    	      
    	    }
    	    /*
    	     * 以下是两个本地方法 在c++中实现
    	     */
    	    public native void javaCallNative();
    	    public native int nativeAdd(int a,int b);
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    2. 将jni.h、jni_md.h头文件复制一份到SGXDemo的src目录下

    这两个文件存在与jdk的安装目录下:
    在这里插入图片描述
    在这里插入图片描述

    3. 生成JNITest.h文件,不需要手动,通过命令行生成

    在这里插入图片描述

    输入命令后,在src目录下会有一个jni_JNITest.h文件,内容如下:

    /* DO NOT EDIT THIS FILE - it is machine generated */
    #include <jni.h>
    /* Header for class jni_JNITest */
    
    #ifndef _Included_jni_JNITest
    #define _Included_jni_JNITest
    #ifdef __cplusplus
    extern "C" {
    #endif
    /*
     * Class:     jni_JNITest
     * Method:    javaCallNative
     * Signature: ()V
     */
    JNIEXPORT void JNICALL Java_jni_JNITest_javaCallNative
      (JNIEnv *, jobject);
    
    /*
     * Class:     jni_JNITest
     * Method:    nativeAdd
     * Signature: (II)I
     */
    JNIEXPORT jint JNICALL Java_jni_JNITest_nativeAdd
      (JNIEnv *, jobject, jint, jint);
    
    #ifdef __cplusplus
    }
    #endif
    #endif
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    对上面的jni_JNITest.h做一个修改,#include <jni.h>-->#include "jni.h"

    4. 编写jni_JNITest.cpp文件

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    #include "jni_JNITest.h"
    
     
     
    JNIEXPORT void JNICALL Java_jni_JNITest_javaCallNative
    (JNIEnv * env, jobject jObj) {
    	printf("Java_jni_JNITest_javaCallNative---->\n");
    }
     
    
    JNIEXPORT jint JNICALL Java_jni_JNITest_nativeAdd
      (JNIEnv *, jobject jobj, jint a, jint b){
      		printf("in c++: %d+%d=%d",a,b,a+b);
      		return a+b;
      }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    5. 编译、生成dll文件
    在这里插入图片描述

    gcc -c jni_JNITest.cpp
    gcc -shared -o JNIDll.dll jni_JNITest.o
    
    • 1
    • 2

    经过编译、链接操作后,src目录下会出现一个JNIDll.dll文件

    6. 运行

    运行结果如下:

    在这里插入图片描述

    static {
    	        System.load("D:\\eclipse_java\\SGXDemo\\src\\JNIDll.dll");
    		 //System.loadLibrary("JNIDll");
    	    }
    
    • 1
    • 2
    • 3
    • 4

    这里用的是load,写的的绝对路径,并且加上了dll后缀,如果要使用第2种loadLibrary的方式,需要进行如下操作:

    右键项目->Build Path->Configure Build Path, 进入如下界面
    在这里插入图片描述

    选择本地库的路径,这里我们选择的是项目的src目录,因为dll文件在该目录下,然后使用第2种加载方式进行加载,运行结果和第一种加载相同

  • 相关阅读:
    快速排序的简单理解
    Python应用程序:从Android日志到Excel文件的智能过滤和输出
    【毕业设计源码】基于小程序蔬菜/零食商城系统
    OB_MYSQL UPDATE 优化案例
    lambda表达式
    根据文档头判断文档后缀并修改
    Flutter 教程之 Kotlin 多平台与 Flutter,为您的应用选择哪一个
    【ffmpeg】ffmpeg+SDL实现播放器
    Haproxy搭建Web群集
    Rabbitmq 简单介绍
  • 原文地址:https://blog.csdn.net/qq_43478694/article/details/125015239