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

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

对上面的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;
  }

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

gcc -c jni_JNITest.cpp
gcc -shared -o JNIDll.dll jni_JNITest.o

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

6. 运行

运行结果如下:

在这里插入图片描述

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

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

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

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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CodePanda@GPF

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值