- 前言
- 创建Java调用类
- 生成.h和.class文件
- 编写c++代码并编译
- Java调用c++
- 结语
最近在做一个网络udp通讯的项目时,遇到了无法转换十六进制报文的问题,思索了几天发现无法用Java实现(可能是自己能力不足)。于是便想借助c++的内存拷贝函数,在网上搜刮了半天总结出以下内容,仅供参考。
创建Java调用类*首先创建一个Java类,创建一个native方法。
public class HelloCPlus {
/**
* 获取short类型的节点的值
* @param a
* @param b
* @return
*/
public native short BytesTestShort(byte a,byte b);
}
生成.h和.class文件
在之前类的路径下打开命令行输入以下指令,之后会在该路径下生成.h和.class文件
复制一份上面生成的.h文件副本,修改后缀为cpp就可以在里面写c++的代码了。
*记得删掉删掉文件头和尾的if end
*在代码头部添加.h文件
/* DO NOT EDIT THIS FILE - it is machine generated */
#include
#include
#include "com_wjs_test_HelloCPlus.h"
/* Header for class com_wjs_test_HelloCPlus */
/*
* Class: com_wjs_test_HelloCPlus
* Method: BytesTestShort
* Signature: (BB)S
*/
JNIEXPORT jshort JNICALL Java_com_wjs_test_HelloCPlus_BytesTestShort
(JNIEnv *, jobject, jbyte a, jbyte b){
jshort value;
char bytes[3];
bytes[0] = a;
bytes[1] = b;
memcpy(&value,bytes,2);
return value;
}
编译代码需要c++环境(这个不在此过多概述,自己去官网下载配置即可),我这里是从官网下载的压缩包,解压之后即可直接使用。找不到下载地方的朋友也可以私信我要压缩包。
解压直接在里面的bin目录打开命令行,输入以下命令,命令的前半部分是为了包含jdk中的两个文件所对应的路径,中间的hello.dll为生成后文件的名称,可根据需求更改。后半段指向cpp文件的路径。回车之后什么都不显示即为成功,此时bin目录下会生成dll文件。
把生成的dll文件复制出来放入到项目src同目录下。之后编写Java代码。运行即可。
public class HelloCPlus {
//加载dll文件
static {
System.load(System.getProperty("user.dir") + "\hello.dll");
}
public static void main(String[] args) {
HelloCPlus helloCPlus = new HelloCPlus();
byte[] bytes = new byte[8];
bytes[0] = (byte) 255;
bytes[1] = (byte) 255;
byte b1 = bytes[0];
byte b2 = bytes[1];
short i = helloCPlus.BytesTestShort(b1, b2);
System.out.println(i);
}
public native short BytesTestShort(byte a,byte b);
}
结语
该文章是在上班摸鱼的时候写出来的,所以可能会有些细节上的不足,有问题的朋友可以评论或私信问我,共同学习,共同进步!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)