java调用c/c++类库(JNI技术)

硅谷探秘者 2066 0 0

java调用c/c++类库(JNI技术)

1.在java项目下创建native方法

package jni;
/**
 * @author jiajia
 */
public class JniTest {
	public static native void printf(String str);//打印str
	public static native int add(int a,int b);//return a+b
}


2.生成c/c++头文件(.h)

到项目根目录下执行命令:

javah -classpath ./bin -d ./cpp -jni jni.JniTest

此时会在项目根目录下自动创建cpp目录,里边有一个jni_JniTest.h的文件


image.png

QQ截图20190501130548.png


3.创建c++项目


image.png


选择win32应用程序


image.png

image.png


选中dll,空项目


image.png

生成的目录如下

image.png


将 jdk 目录下的 jni.h 、 jni_md.h 以及之前生成的 jni_JniTest.h 放入c++项目根路径下的 include 文件夹 (include 文件夹需自己创建)


QQ截图20190501132807.png


添加c++项目包含目录,将上一步创建的 include 文件夹包含进c++项目


QQ截图20190501133113.png

QQ截图20190501133158.png

QQ截图20190501133248.png

QQ截图20190501133306.png


这样就把include 文件夹包含进c++项目


接下来创建cpp文件实现头文件中的方法


QQ截图20190501133423.png

创建cpp文件

QQ截图20190501133456.png


QQ截图20190501133922.png


注意要引入头文件

方法名称可以从头文件中复制,实现其方法即可

#include<iostream>
#include "jni_JniTest.h"
using namespace std;
JNIEXPORT void JNICALL Java_jni_JniTest_printf
(JNIEnv *env, jclass obj, jstring str){
	char * t;
	t = (char*)env->GetStringUTFChars(str, 0);
	cout << t << endl;
}
/*
* Class:     jni_JniTest
* Method:    add
* Signature: (II)I
*/
JNIEXPORT jint JNICALL Java_jni_JniTest_add
(JNIEnv *env, jclass obj, jint ia, jint ib){
	return ia + ib;
}


4.生成dll文件

QQ截图20190501133947.png


QQ截图20190501134017.png

这样就生成成功了。生成的dll文件就放在上图的目录中


5.把生成的dll库文件放入jdk的bin目录下


QQ截图20190501134204.png


6.然后编写java测试类,并运行

QQ截图20190501134351.png


结果发现报错,原因是生成的dll库文件是32位的。

Exception in thread "main" java.lang.UnsatisfiedLinkError: 
C:\Program Files\Java\jdk1.8.0_211\bin\JniTest.dll: Can't load IA 32-bit .dll on a AMD 64-bit platform
at java.lang.ClassLoader$NativeLibrary.load(Native Method)
at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1941)
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1857)
at java.lang.Runtime.loadLibrary0(Runtime.java:870)
at java.lang.System.loadLibrary(System.java:1122)
at jni.TestMain.<clinit>(TestMain.java:5)


接下来进行设置并重新生成64位的dll库文件

QQ截图20190501134442.png

QQ截图20190501134518.png

QQ截图20190501134542.png

QQ截图20190501134605.png


设置好以后重新生成dll文件


QQ截图20190501140025.png


注意此次生成的文件目录和上次不一样,在根目录下有一个/64/debug/..

将此文件覆盖之前jdk的bin目录下的dll文件。

然后重新运行java项目

package jni;

public class TestMain {
	static {  
		System.loadLibrary("JniTest");  
	} 
	public static void main(String[] args) {
		System.out.println(JniTest.add(1, 3));
		JniTest.printf("hello jni");
	}
}


QQ截图20190501134904.png

调用成功



评论区
请写下您的评论...
暂无评论...
猜你喜欢
其他 3906 1.动态编译从JDK1.6开始引入了Java代码重写的编译器接口,使得我们可以在运行时编译Java源码,然后加载器进行加载,让Java语言更具灵活性,能够完成许多高级的操作。2.本次要实现
nginx,前端,java基础 1330   基于javanio+netty+websocket+protobuf+javascript等实现前后端高性能实时数据传输的demo模型。  github地址:https
official 909 强的抗干扰能力,其频谱似千白噪声,不易被敌人发现。随着的进步,CDMA设备的价格和体积都大幅度下降,因而现在已广泛使在民的移动通信中,特别是在无线局域网中。采CDMA可提高通信的话音质量和
official 1044   基于javanio+netty+websocket+protobuf+javascript等实现前后端高性能实时数据传输的demo模型。  github地址:https
工具 2645 /dependency2.java代码SoapClientclient=SoapClient.create("http://cwzf.zzcsjr.edu.cn/xysf/OrderView.asmx")//设
java基础 2134 JavaAgent是运行在main方法之前的拦截器,它内定的方法名叫premain,也就是说先执行premain方法然后再执行main方法。Javaagent只要作在class被加载器加载之前对
weblog 1051 java攻城尸,熟练使各种框架,并知道它们实现的原理。jvm虚拟机原理、优,懂得jvm能让你写出性能更好的代码;池,什么对象池,连接池,线程池...:;java反射,写框架必备的,但是
spring/springmvc 5802 springmvc启动时从数据中初始化系统常量设计的目标是,把项目的系统常量配置,放在数据中,在项目初始化时从项目中获取配置信息,利反射,把key-value对应的值自动封装进配置。1
归档
2018-11  12 2018-12  33 2019-01  28 2019-02  28 2019-03  32 2019-04  27 2019-05  33 2019-06  6 2019-07  12 2019-08  12 2019-09  21 2019-10  8 2019-11  15 2019-12  25 2020-01  9 2020-02  5 2020-03  16 2020-04  4 2020-06  1 2020-07  7 2020-08  13 2020-09  9 2020-10  5 2020-12  3 2021-01  1 2021-02  5 2021-03  7 2021-04  4 2021-05  4 2021-06  1 2021-07  7 2021-08  2 2021-09  8 2021-10  9 2021-11  16 2021-12  14 2022-01  7 2022-05  1 2022-08  3 2022-09  2 2022-10  2 2022-12  5 2023-01  3 2023-02  1 2023-03  4 2023-04  2 2023-06  3 2023-07  4 2023-08  1 2023-10  1 2024-02  1 2024-03  1 2024-04  1
标签
算法基础 linux 前端 c++ 数据结构 框架 数据库 计算机基础 储备知识 java基础 ASM 其他 深入理解java虚拟机 nginx git 消息中间件 搜索 maven redis docker dubbo vue 导入导出 软件使用 idea插件 协议 无聊的知识 jenkins springboot mqtt协议 keepalived minio mysql ensp 网络基础 xxl-job rabbitmq haproxy srs 音视频 webrtc javascript
目录
没有一个冬天不可逾越,没有一个春天不会来临。最慢的步伐不是跬步,而是徘徊,最快的脚步不是冲刺,而是坚持。