- 浏览: 1562507 次
- 性别:
- 来自: 吉林
文章分类
- 全部博客 (624)
- C/C++ (33)
- Java (181)
- 网络相关 (7)
- 我爱篮球 (3)
- 也爱足球 (4)
- 杂谈 (1)
- 系统架构 (3)
- Web Service (14)
- Framework (3)
- 系统命令 (8)
- 管理平台相关 (8)
- 其它 (35)
- Websphere (1)
- Struts2 (24)
- Hibernate (16)
- Spring (23)
- javascript (20)
- jquery (23)
- html/css/div (28)
- 数据库 (40)
- JavaWeb (27)
- 设计模式 (2)
- 文档编写 (3)
- SVN (5)
- Ant (1)
- Maven (13)
- 软件项目管理 (8)
- AOP (1)
- kindeditor (1)
- JSON (2)
- Servlt/JSP (4)
- WordXML (2)
- XML (12)
- 面试相关 (7)
- Tomcat (11)
- 性能与调优 (29)
- 职业发展 (2)
- 操作系统 (7)
- AJAX (2)
- DWR (1)
- Eclipse (12)
- 持续集成 (3)
- 批处理命令 (1)
- Mozilla Rhino (2)
- 新鲜技术 (18)
- Apache mina (2)
- 底层技术 (18)
- Linux (22)
- 新鲜技术,IT历史 (1)
- 敏捷开发 (1)
- 版本控制 (5)
- 较火技术 (7)
- 集群 (2)
- Web前端 (13)
- 报表工具 (3)
- 网站架构 (5)
- 大数据 (8)
- 分布式存储 (5)
- 云计算 (8)
- TCP/IP协议 (1)
- 负载均衡 (3)
- 硬件 (1)
- 表现层技术 (3)
- Velocity (3)
- jvm (6)
- 并发编程 (10)
- hadoop (8)
- 数据结构和算法 (12)
- 计算机原理 (1)
- 测试驱动开发-TDD (3)
- 开发技巧 (1)
- 分词器 (1)
- 项目构建工具 (2)
- JMX (4)
- RMI (1)
- 测试技术 (22)
- 网络完全 (1)
- Git (4)
- apache开源包 (4)
- Java常用 (1)
- mock (2)
- OSGi (2)
- MongoDB (1)
- JBPM (1)
- Storm (3)
- mysql (2)
- telnet (1)
- 正则表达式 (1)
- bootstrap (4)
- Apache ActiveMQ (1)
- redis (9)
- Nginx (2)
- rsync+inotify文件同步 (2)
- testng (1)
- 原型设计工具 (1)
- 工程能力 (1)
- 风险控制 (3)
- ibatis (1)
- 分布式 (4)
- 安全技术 (1)
- 计算机基础 (4)
- 消息中间件 (1)
- UML (2)
最新评论
-
u012236967:
java命令执行jar包(里面的main函数)的方式(包括依赖其它的jar包问题) -
世界尽头没有你:
Selenium自动化测试从入门到精通(Java版)百度网盘地 ...
自动化测试工具 Selenium WebDriver 入门教程(针对主流浏览器) -
小小西芹菜:
我喜欢代码简洁易读,服务稳定的推送服务,前段时间研究了一下go ...
dwr实现Reverse Ajax推送技术的三种方式 -
hellozhouqiao:
楼主,请教一点问题.现在我们需要在excel 的页脚里面加上图 ...
FreeMaker + xml 导出word(处理目录,图片和页眉页脚问题) -
乱在长安:
使用Timer会有各种各样的问题好嘛?!书上推荐使用Sched ...
DelayQueue (ScheduledThreadPoolExecutor调度的实现)
相关:JNI-百度百科:http://baike.baidu.com/view/1272329.htm
JNI-完全手册:http://www.jcwcn.com/html/Java/10_43_37_489.htm
以下这个例子实现的是通过调用C写的DLL,计算字符串长度。
一、 生成C的头文件
1. 编辑Main.java
public class Main
{
public native static int getStrNum(byte str[], int strLen);
}
2. 生成头文件
按win + r打开“运行”窗口,输入“cmd”,打开DOS控制台窗口。进入上面Main.java所在的目录中,输入:
javac Main.java
javah Main
两条命令完成后会生成Main.h文件
二、 生成DLL
1. 新建空工程
在VS中新建工程:Win32 Console Application,取名“MakeDLL”,选择空工程。新建后修改工程属性:
(1) General中,将“Configuration Type”改为“Dynamic Library (.dll)”;
(2) C/C++的General中,将“Additional Include Directories”添加两项:
“C:Program FilesJavajdk1.5.0_06include”
“C:Program FilesJavajdk1.5.0_06includewin32”
根据你安装的JAVA路径而设置,这是因为在C/C++编译过程中要使用JAVA的jni.h等文件
2. 将上面生成的Main.h添加入工程
3. 新建一个新的文件main.cpp,代码如下:
#include 'Main.h'
#include 'string.h'
JNIEXPORT jint JNICALL Java_Main_getStrNum
(JNIEnv *env, jclass cls, jbyteArray str, jint strLen)
{
jbyte *buffer = (*env).GetByteArrayElements(str, 0);
buffer[strLen] = ''; // 由于JAVA自动分配空间,需要传进来字符串长度参数
jint len = strlen((char*)buffer);
return len;
}
4. 按F7编译链接,生成MakeDLL.dll文件
三、 JAVA调用DLL
在JAVA中使用上面生成的DLL文件:
1. 将MakeDLL.dll复制到与使用DLL的JAVA文件相同的目录下。
2. JAVA文件的源代码:
public class Main
{
static
{
System.loadLibrary('MakeDLL');
}
public native static int getStrNum(byte str[], int strLen);
public static void main(String[] args)
{
Main instance = new Main();
String str = new String('haha');
int num = instance.getStrNum(str.getBytes(), str.length());
System.out.println(num);
}
}
总结:
另外,JAVA与DLL函数的参数传递过程,像int类型的,可以直接从JNI函数参数列表中获取;而数组元素则要通过JNIEnv来获取:
jbyte *buffer = (*env).GetByteArrayElements(str, 0); // str是参数列表中jbyteArray变量
同理可以获取char[]的元素。
函数返回时,可以直接用return语句返回。也可以设置参数列表中的变量指针来返回:
(*env).SetByteArrayRegion(byteArray, 0, 128, byteArr);
byteArray是参数列表中的jbyteArray变量,作为指针用来返回需要返回的信息;byteArr是jbyte*类型,里面存放的值是要返回的内容。
其它的信息可以从Google或Baidu中通过查找“jni”或“java调用DLL”来查阅到
发表评论
-
Java SE7新特性之二进制字面量
2016-12-14 22:53 793Java SE 7中, 整数类型(byte, shor ... -
浮点数为什么不精确?为什么银行的金额不能用浮点数计算
2016-12-14 22:52 1955浮点数为什么不精确? 其实这句话本身就不精确, 相对精确一 ... -
计算机是如何计算乘法除法的(实际上都是转换为二进制加法计算)
2016-12-14 22:46 6587http://blog.csdn.net/blues1021 ... -
什么是补码、反码、负数在计算中如何表示
2016-12-14 22:39 876负数在计算机中如何表 ... -
Math.abs()绝对值取到的数不一定是正数
2016-12-14 22:37 1216Math.abs() 注释:Note that if th ... -
用BigInteger实现大素数生成算法
2016-12-06 16:42 1797转自:http://www.cnblogs.co ... -
加密(AES)、公私钥(PKI)、摘要(DIGEST)、签名(SIGNATURE)、证书(CERT)的形象解释和组合用法
2016-09-15 18:19 92841.鲍勃有两把钥匙,一把是公钥,另一把是私钥。 ... -
RSA加密公私钥生成工具(openssl)
2016-09-15 13:00 1139https://www.openssl.org/source/ ... -
RPC原理详解
2016-06-23 20:47 543RPC 功能目标 RPC 的主要功能目标是让构建分布式计算 ... -
Java并发之CountDownLatch、CyclicBarrier和Semaphore
2016-06-23 20:36 1370这次说一下 JUC 中的同步器三个主要的成员:CountDo ... -
线程间协作的两种方式:wait、notify、notifyAll和Condition
2016-06-23 20:35 527在前面我们将了很多关于同步的问题,然而在现实中,需要线程之 ... -
The final local variable xxx cannot be assigned, since it is defined in an enclo
2016-04-24 17:42 1554本文就自己编程时候遇到的一个问题,简要描述一下,并提出解决 ... -
一个奇葩的excel中无法trim的“空格”的问题
2016-03-29 16:21 1880太奇怪了。打印出来的命名是空格,就是 trim() 不管用。 ... -
List深度复制
2016-02-17 09:34 2634昨天弄了一个类似List<Map<String, ... -
Eclipse导入 jar 源码乱码问题
2015-12-15 19:43 836http://blog.csdn.net/laiwenqian ... -
Java高并发编程的各种陷阱
2015-07-25 17:49 970www.iteye.com/blogs/subjects/ja ... -
ASM介绍(java字节码操作利器)
2015-06-10 20:46 4310转自:http://www.ibm.com/de ... -
JDK 7 中的 Fork/Join 模式(并发处理)
2015-06-03 19:47 951转自:http://www.ibm.com/dev ... -
Java常见内存溢出异常分析
2015-06-03 16:36 788转自:http://www.iteye.com/news/3 ... -
dom4j解析带有命名空间的xml
2015-04-09 21:23 5472Element rootEle = resultDoc.g ...
相关推荐
最近项目中需要使用JNI,所以研究了一下,其中遇到过不少问题,总结一下,让遇到同样问题的人...在C/C++中调用Java的方法一般分为五个步骤:初始化虚拟机、获取类、获取类的方法、创建类对象、调用方法和退出虚拟机。
假如有一个现有的 .dll/.so 文件,假如使用 JNI 技术调用,我们首先需要另外使用 C 语言写一个 .dll/.so 共享库,使用 SUN 规定的数据结构替换 C 语言的数据结构,调用已有的 ? dll/so 中公布的函数。 然后再在 Java...
在linux下,java调用c语言编译的*.so动态链接库的小例子.是一个简单计算器的例子.在java中传操作数和操作符,由C来计算,把结果传过来给java.
赠送Maven依赖信息文件:zstd-jni-1.4.3-1.pom; 包含翻译后的API文档:zstd-jni-1.4.3-1-javadoc-API文档-中文(简体)-英语-对照版.zip; Maven坐标:com.github.luben:zstd-jni:1.4.3-1; 标签:github、luben、...
RFID读卡程序-桌面应用程序-Java语言开发-JNI调用Delphi版DLL
完整的实现java跨平台调用C程序源码,包含JAVA源码和C源码以及编译后的demo dll。将dll放到jdk bin目录下,java 项目可以直接运行。若要修改dll可以,修改C源码后重新编译生成dll。该demo处理了多线程调用c,全局...
libtensorflow_jni-cpu-windows-x86_64-1.6.0 libtensorflow_jni-cpu-windows-x86_64-1.6.0 libtensorflow_jni-cpu-windows-x86_64-1.6.0 libtensorflow_jni-cpu-windows-x86_64-1.6.0 libtensorflow_jni-cpu-...
赠送Maven依赖信息文件:zstd-jni-1.4.3-1.pom; 包含翻译后的API文档:zstd-jni-1.4.3-1-javadoc-API文档-中文(简体)版.zip; Maven坐标:com.github.luben:zstd-jni:1.4.3-1; 标签:github、luben、zstd、jni、...
本文详细介绍了JNI-JAVA与C++的混和开发技术,使读者能轻松实现JAVA中调用C++模块。
本资源包括JAVA工程,C++工程,C#dll测试工程
赠送Maven依赖信息文件:zstd-jni-1.4.4-3.pom; 包含翻译后的API文档:zstd-jni-1.4.4-3-javadoc-API文档-中文(简体)-英语-对照版.zip; Maven坐标:com.github.luben:zstd-jni:1.4.4-3; 标签:github、luben、...
android aes-jni java和c互加解密
赠送Maven依赖信息文件:zstd-jni-1.3.8-1.pom; 包含翻译后的API文档:zstd-jni-1.3.8-1-javadoc-API文档-中文(简体)-英语-对照版.zip; Maven坐标:com.github.luben:zstd-jni:1.3.8-1; 标签:github、luben、...
赠送Maven依赖信息文件:zstd-jni-1.3.8-1.pom; 包含翻译后的API文档:zstd-jni-1.3.8-1-javadoc-API文档-中文(简体)版.zip; Maven坐标:com.github.luben:zstd-jni:1.3.8-1; 标签:github、luben、zstd、jni、...
Java通过JNI调用DLL动态库,亲测试编写
JAVA通过JNI调用本地C语言方法 JAVA以其跨平台的特性深受人们喜爱,而又正由于它的跨平台的目的,使得它和本地机器的各种内部联系变得很少,约束了它的功能。解决JAVA对本地操作的一种方法就是JNI。
Android Studio3.0开发JNI流程,C++调用Java以及Java调用C++,C++/Java互相调用一个简单案例
赠送Maven依赖信息文件:zstd-jni-1.3.2-2.pom; 包含翻译后的API文档:zstd-jni-1.3.2-2-javadoc-API文档-中文(简体)版.zip; Maven坐标:com.github.luben:zstd-jni:1.3.2-2; 标签:zstd、github、jni、luben、...
用c语言写了一个清屏的函数,然后生成动态链接库,再通过jni在java里调用清屏函数。请注意代码中的函数JNIEXPORT void JNICALL Java_Test_cls(JNIEnv *env, jobject obj),函数名字的Test是指使用该函数的Java类的...
[JAVA]使用JNI技术实现JAVA程序调用dll、[JAVA]使用JNI技术实现JAVA程序调用dll