Java JNI调用c语言的dll测试
最近复习C语言和java语言(10年没用了,温习一下),用JNI调用C语言的dll测试,以前没做过,在网上找了很多,总结如下:
环境:windows 10(64位) + JDK(32位,版本1.7.0_79) + MinGW(32位),注意JDK和MinGW要么都是32位,要么都是64位,不能一个是32位另一个是64位。
java和MinGW的环境配置在网上查找。
一、【不用eclipse,用记事本手工编辑 .java和 .c 程序】
1、hello.java代码如下:

2、编译Hello.java程序命令:javac Hello.java --生成Hello.class文件。
3、生成Hello.h文件命令:javah Hello --生成Hello.h头文件,该头文件在C语言编码中要用到,所以将Hello.h存放到后缀为 .c 文件代码相同的目录。

4、arr.c文件内容如下:

5、C编译环境准备:需要将JDK对应的 jni_md.h 和 jni.h 两个文件拷贝到MinGW的安装目录的include目录下。
jni_md.h在 %JAVA_HOME%\ include\win32目录下; jni.h在%JAVA_HOME%\ include目录下。
如果不想拷贝,则在下面的6步命令末尾需要添加如下内容:
-I"C:\Program Files (x86)\Java\jdk1.7.0_79\include" -I"C:\Program Files (x86)\Java\jdk1.7.0_79\include\win32"
其中,JAVA_HOME=C:\Program Files (x86)\Java\jdk1.7.0_79. 根据自己的JAVA_HOME路径修改。
添加双引号是因为gcc命令行解释不了”Program Files (x86)“中的空格字符。
6、编译生成 hello.dll 动态库文件命令:
gcc arr.c -shared -o hello.dll -Wl,--kill-at
命令解释:
-shared -o hello.dll /* 指定编译生成的目标文件 hello.dll是动态库文件 */
-Wl /* 告诉编译器将后面的参数传递给链接器 */
-Wl,--kill-at /*告诉链接器去掉函数名称后缀的@符号 --该问题涉及比较深入的东西,暂时不管,只管按命令执行,生成 .dll 文件,实现测试目的。*/
7、检查测试目录 E:\test下的文件如下 :

8、执行 java Hello,成功!
二、【使用Eclipse编辑】
使用 eclipse 编辑的区别主要在 JAVA 源程序常常装在 package 中,所以需要特别处理一下:
1、编辑完成 .java 代码后,就用eclipse 编译成.class文件。
2、使用javah -o E:\test\com_test_HelloWorld.h -classpath $ProjectPath\build\classes com.test.HelloWorld
$ProjectPath :该路径指eclipse中生成HelloWorld.java项目的路径。
注意:com.test.HelloWorld这个名称一定要按自己的 package 顺序写完。
3、使用命令行生成JNI格式的C语言头文件.h文件:
gcc arr.c -shared -o 希望存放的路径\hello.dll -Wl,--kill-at -I"JDK安装路径\include" -I"JDK安装路径\include\win32"
希望存放的路径:指生成的hello.dll文件存放路径。
JDK安装路径: 指自己的JAVA_HOME目录路径。
4、在 eclipse的项目配置中(右键项目名称->Build Path -> Configure Build Path,然后选择 Java Build Path ,在右边的Source 页展开当前项目;
然后,选中Native Library Location,点击“Edit” ,再选择“Workspace”,将第3步生成的 .dll 文件目录添加到项目中。
5、运行HelloWorld,成功!
三、JNI测试常见错误 java.lang.UnsatisfiedLinkError:
参考:http://blog.csdn.net/binyao02123202/article/details/18075747
http://blog.csdn.net/niuxinlong/article/details/4176612
Java JNI调用c语言的dll测试的更多相关文章
- java jni 调用c语言函数
今日在hibernate源代码中遇到了native关键词,甚是陌生,就查了点资料,对native是什么东西有了那么一点了解,并做一小记. native关键字说明其修饰的方法是一个原生态方法,方法对应的 ...
- Java动态调用脚本语言Groovy
Java动态调用脚本语言Groovy 2019-05-15 目录 0. pom.xml添加依赖1. 使用GroovyShell计算表达式2. 使用GroovyScriptEngine脚本引擎加载Gro ...
- Java採用JNI调用VC++生成的dll(Java与C++交互)
应项目需求,须要android调用java,java再调用C++实现android一个图片匹配的功能,我们作为java组须要和C++和Android进行交互.以下是java和C++採用JNI的方式进行 ...
- 关于Java通过JNI调用C 动态链接库(DLL)
JNI介绍 用JNI实现Java和C语言的数据传递 JNI原理分析和详细步骤截图说明 jni的JNIEnv指针和jobject指针 JNI实现回调| JNI调用JAVA函数|参数和返回值的格式 Jni ...
- Java如何调用C语言程序,JNI技术
Java为什么要调用C语言编写的程序因为涉及操作系统底层的事件,Java是处理不了的,例如用户上传一个视频文件,需要后台给视频加上水印,或者后台分离视频流和音频流,这个事Java就做不了,只能交给C语 ...
- Java的native关键字---JAVA下调用其他语言的关键词
今天研究Java基础类库,Object类的时候,发现了一个关键字:native 咦?这是个什么东东?它认识我,我可不认识它! 嘿嘿,没关系,baidu一下. java native关键字 一. 什么是 ...
- Java语言与C语言混合编程(2)--在Java中调用C语言本地库
在上一篇文章中介绍了Java语言中的native关键字,以及Java语言调用C语言的编译生成本地动态链接库(DLL)实现加法运算的小例子,本文通过一个更加详细的例子,深入讲解Java语言调用C语言的函 ...
- code::Blocks生成的dll 在 java jni 调用遇到的问题
Test.java__________________________________ public class Test{ public static native void p(); pub ...
- java jni 调用c++ opencv代码成功范例
java上建立接口定义 package com.dtk; public class Rec { public native String RecImage(String src); public st ...
随机推荐
- 安装Hadoop系列 — eclipse plugin插件编译安装配置
[一].环境参数 eclipse-java-kepler-SR2-linux-gtk-x86_64.tar.gz //现在改为eclipse-jee-kepler-SR2-linux-gtk-x86_ ...
- minitools
1.android 2.linux 3.luoji 4.windows CE ----
- 手机通过WIFI连上ZXV10 H618B路由器但不能上网问题的解决
前几天朋友帮忙拿到一个ZXV10 H618B路由器,一看需要12V供电,还好以前留下一个12V输出的DC充电器,关键时刻用上了,先大概下载了此路由器的用户手册,发现原来是08年的产品,都5年了. 开始 ...
- 将OutLook.exe注册为服务,让其一直保持开启状态
类似于TaobaoProtect.exe是由TBSecSvc服务启动的 http://stackoverflow.com/questions/3582108/create-windows-servic ...
- Spring-Data-JPA学习
Spring-Data-JPA结构图 网址: http://blog.sina.com.cn/s/blog_667ac0360102ecsf.html
- poj1989
一道非常神奇的题目 var v:array[0..10010] of boolean; n,k,i,x,ans,s:longint; begin readln(n,k); fillchar(v,siz ...
- ZOJ 2676 Network Wars ★(最小割算法介绍 && 01分数规划)
[题意]给出一个带权无向图,求割集,且割集的平均边权最小. [分析] 先尝试着用更一般的形式重新叙述本问题.设向量w表示边的权值,令向量c=(1, 1, 1, --, 1)表示选边的代价,于是原问题等 ...
- jquery滚动条
查看demo: 下载Demo
- 用纯css写出三角形
1.新建一个元素,随便什么元素,不过我习惯性的会用块元素来做.如果行内元素就display:block它.<div class="triangle"></div& ...
- angularjs filter 详解
系统的学习了一下angularjs,发现angularjs的有些思想根php的模块smarty很像,例如数据绑定,filter.如果对smarty比较熟悉的话,学习angularjs会比较容易一点.这 ...