最近复习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. WCF异步

    WCF异步与否由客户端来决定 服务端接口: // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的接口名“IService1”.    [ServiceContract]   ...

  2. CCS学习资料汇总

    2013-06-20 10:31:52 CSDN无网无痕的专栏,有比较多的关于DSP的文章: http://blog.csdn.net/zzsfqiuyigui/article/details/694 ...

  3. caffe简易上手指南(三)—— 使用模型进行fine tune

    之前的教程我们说了如何使用caffe训练自己的模型,下面我们来说一下如何fine tune. 所谓fine tune就是用别人训练好的模型,加上我们自己的数据,来训练新的模型.fine tune相当于 ...

  4. Windows Embedded Compact 2013 安装体验

    6月14日,微软正式发布了Windows embedded compact 2013,大家还是习惯称之为Window CE 8,公司也要开始做windows embedded compact 2013 ...

  5. Eclipse导入项目

    导入Eclipse项目 File->Import...->Existing Projects into Workspace->Next->Browse...->Finis ...

  6. sublime text格式化插件

    sublime text 软件其实是自带格式化插件的,但是它默认的格式化插件,不太好用,且没有快捷键(虽然自己可以设置). 其默认的格式化是在 Edit  ->  Line  ->  Re ...

  7. js2word/html2word的简单实现

    js2word/html2word的简单实现 以C#描述如下:             StringBuilder sb = new StringBuilder();            sb.Ap ...

  8. 中国海洋大学第四届朗讯杯高级组 Cash Cow(模拟)

    题目:http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2721 题意: 给定n个左标,跟那n个坐标 ...

  9. poj 1328 Radar Installation(贪心)

    题目:http://poj.org/problem?id=1328   题意:建立一个平面坐标,x轴上方是海洋,x轴下方是陆地.在海上有n个小岛,每个小岛看做一个点.然后在x轴上有雷达,雷达能覆盖的范 ...

  10. WinCE发展史

    Windows CE概述 WindowsCE是微软公司嵌入式.移动计算平台的基础,它是一个开放的.可升级的32位嵌入式操作系统,是基于掌上型电脑类的电子设备操作系统,它是精简的Windows 95,W ...