最近复习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测试的更多相关文章

  1. java jni 调用c语言函数

    今日在hibernate源代码中遇到了native关键词,甚是陌生,就查了点资料,对native是什么东西有了那么一点了解,并做一小记. native关键字说明其修饰的方法是一个原生态方法,方法对应的 ...

  2. Java动态调用脚本语言Groovy

    Java动态调用脚本语言Groovy 2019-05-15 目录 0. pom.xml添加依赖1. 使用GroovyShell计算表达式2. 使用GroovyScriptEngine脚本引擎加载Gro ...

  3. Java採用JNI调用VC++生成的dll(Java与C++交互)

    应项目需求,须要android调用java,java再调用C++实现android一个图片匹配的功能,我们作为java组须要和C++和Android进行交互.以下是java和C++採用JNI的方式进行 ...

  4. 关于Java通过JNI调用C 动态链接库(DLL)

    JNI介绍 用JNI实现Java和C语言的数据传递 JNI原理分析和详细步骤截图说明 jni的JNIEnv指针和jobject指针 JNI实现回调| JNI调用JAVA函数|参数和返回值的格式 Jni ...

  5. Java如何调用C语言程序,JNI技术

    Java为什么要调用C语言编写的程序因为涉及操作系统底层的事件,Java是处理不了的,例如用户上传一个视频文件,需要后台给视频加上水印,或者后台分离视频流和音频流,这个事Java就做不了,只能交给C语 ...

  6. Java的native关键字---JAVA下调用其他语言的关键词

    今天研究Java基础类库,Object类的时候,发现了一个关键字:native 咦?这是个什么东东?它认识我,我可不认识它! 嘿嘿,没关系,baidu一下. java native关键字 一. 什么是 ...

  7. Java语言与C语言混合编程(2)--在Java中调用C语言本地库

    在上一篇文章中介绍了Java语言中的native关键字,以及Java语言调用C语言的编译生成本地动态链接库(DLL)实现加法运算的小例子,本文通过一个更加详细的例子,深入讲解Java语言调用C语言的函 ...

  8. code::Blocks生成的dll 在 java jni 调用遇到的问题

    Test.java__________________________________ public class Test{    public static native void p(); pub ...

  9. java jni 调用c++ opencv代码成功范例

    java上建立接口定义 package com.dtk; public class Rec { public native String RecImage(String src); public st ...

随机推荐

  1. HDU1054Strategic Game(最小顶点覆盖数)

    我们来先了解一下什么是最小顶点覆盖: 图G的顶点覆盖是一个顶点集合V,使得G中的每一条边都接触V中的至少一个顶点.我们称集合V覆盖了G的边.最小顶点覆盖是用最少的顶点来覆盖所有的边.顶点覆盖数是最小顶 ...

  2. 从今天起,正式步入cnblogs,向曾经的脚印说声对不起!

    步入这个行业也好多年了,从来没有定居过一个地方. 看过很多前辈们留下的资料,对后者门(其中还有我)留下很多珍贵的东西. 所以,我要向前辈学习,壮大自己,在学习的同时,不要忘记帮助别人. 对曾经我留下的 ...

  3. Monitor vs WaitHandle

    http://stackoverflow.com/questions/1355398/monitor-vs-waithandle-based-thread-sync A problem with Mo ...

  4. bzoj列表2

    之前发过一次了,这里的题较水,没什么好讲的 bzoj1088 直接穷举前两位即可,话说程序员的扫雷是白玩的? bzoj1083 裸的最小生成树(最小生成树=最小瓶颈树),SCOI大丈夫(话说网上二分是 ...

  5. 在try...catch语句中执行Response.End()后如何停止执行catch语句中的内容

    在调用Response.End()时,会执行Thread.CurrentThread.Abort()操作. 如果将Response.End()放在try...catch中,catch会捕捉Thread ...

  6. UVa 1639 (期望) Candy

    题意: 两个盒子里各有n颗糖,每天有p的概率从第一个盒子里取一颗糖,1-p的概率从第二个盒子里去一颗糖.直到某一天打开某个盒子忽然发现没糖了,求另一个盒子里剩余糖果数的期望. 分析: 紫书上面已经分析 ...

  7. vijos1194 Domino

    vijos上的题解: 1.因为每个格子不是被覆盖就是没被覆盖,状态只有0 1两种,m<=5,所以可以将每一列的状态压缩,看作一个二进制数.2.矩阵G表示从I状态到J状态的路径条数,自乘N次为长度 ...

  8. [.NET WebAPI系列01] WebAPI 简单例子

    [源] 来自微软WebAPI官方视频,Introduction to the ASP.NET Web API --Uniform Interface -- Demo-Using convention ...

  9. mysql修改表、字段、库的字符集

    在一次导入数据表(MYISAM)的经历:复制过来的表打开后中文出现乱码,肯定是字符集出现了不致的问题,所以从原数据库导出.sql文件,修改其中的创建表的语句,加入字符集DEFAULT CHARSET= ...

  10. eayui 验证扩展

    $.extend($.fn.validatebox.defaults.rules, { idcard : {// 验证身份证 validator : function(value) { return ...