java调用c/c++类库(JNI技术)
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的文件
3.创建c++项目
选择win32应用程序
选中dll,空项目
生成的目录如下
将 jdk 目录下的 jni.h 、 jni_md.h 以及之前生成的 jni_JniTest.h 放入c++项目根路径下的 include 文件夹 (include 文件夹需自己创建)
添加c++项目包含目录,将上一步创建的 include 文件夹包含进c++项目
这样就把include 文件夹包含进c++项目
接下来创建cpp文件实现头文件中的方法
创建cpp文件
注意要引入头文件
方法名称可以从头文件中复制,实现其方法即可
#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文件
这样就生成成功了。生成的dll文件就放在上图的目录中
5.把生成的dll库文件放入jdk的bin目录下
6.然后编写java测试类,并运行
结果发现报错,原因是生成的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库文件
设置好以后重新生成dll文件
注意此次生成的文件目录和上次不一样,在根目录下有一个/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");
}
}
调用成功
评论区
请写下您的评论...
猜你喜欢
blog
java动态编译技术原理分析
其他
4365
1.动态编译技术从JDK1.6开始引入了用Java代码重写的编译器接口,使得我们可以在运行时编译Java源码,然后用类加载器进行加载,让Java语言更具灵活性,能够完成许多高级的操作。2.本次要实现
nginx,前端,java基础
1998
基于javanio+netty+websocket+protobuf+javascript等技术实现前后端高性能实时数据传输的demo模型。 github地址:https
ofc
计算机网络-信道复用技术
official
1304
强的抗干扰能力,其频谱类似千白噪声,不易被敌人发现。随着技术的进步,CDMA设备的价格和体积都大幅度下降,因而现在已广泛使用在民用的移动通信中,特别是在无线局域网中。采用CDMA可提高通信的话音质量和
official
1450
基于javanio+netty+websocket+protobuf+javascript等技术实现前后端高性能实时数据传输的demo模型。 github地址:https
工具
2905
/dependency2.java代码调用SoapClientclient=SoapClient.create("http://cwzf.zzcsjr.edu.cn/xysf/OrderView.asmx")//设
blog
初识javaagent技术
java基础
2345
JavaAgent是运行在main方法之前的拦截器,它内定的方法名叫premain,也就是说先执行premain方法然后再执行main方法。Javaagent只要作用在class被类加载器加载之前对
weblog
1328
级java攻城尸,熟练使用各种框架,并知道它们实现的原理。jvm虚拟机原理、调优,懂得jvm能让你写出性能更好的代码;池技术,什么对象池,连接池,线程池...:;java反射技术,写框架必备的技术,但是
spring/springmvc
6012
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
2024-08
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
加密算法
目录
没有一个冬天不可逾越,没有一个春天不会来临。最慢的步伐不是跬步,而是徘徊,最快的脚步不是冲刺,而是坚持。