jni c 语言 避免 除法,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代码如下:

bc53195c561f8c11863957021a1771e9.png

2、编译Hello.java程序命令:javac Hello.java   --生成Hello.class文件。

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

235eeb5d12b69f0eca7fadf7f07c1cf8.png

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

dc726700dbd3159950d666f0bf239f01.png

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下的文件如下 :

766b5fe3bf03a3c232efd1b9ac9d0341.png

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语言函数

今日在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的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 ...

java中调用本地动态链接库(*.DLL)的两种方式详解和not found library、打包成jar,war包dll无法加载等等问题解决办法

我们经常会遇到需要java调用c++的案例,这里就java调用DLL本地动态链接库两种方式,和加载过程中遇到的问题进行详细介绍 1.通过System.loadLibrary("dll名称,不 ...

随机推荐

BZOJ1500: [NOI2005]维修数列[splay ***]

1500: [NOI2005]维修数列 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 12278  Solved: 3880[Submit][Statu ...

C语言中的回调函数调用过程以及函数指针使用

回调函数比喻: 你到一个商店买东西,刚好你要的东西没有货,于是你在店员那里留下了你的电话,过了几天店里有货了,店员就打了你的电话,然后你接到电话后就到店里去取了货. 在这个例子里,你的电话号码就叫回调 ...

C++——友元、异常和其他

一.友元 类并非只能拥有友元函数,也可以将类作为友元.在这种情况下,友元类的所有方法都可以访问原始类的私有成员和保护成员.另外,也可以做更严格的限制,只将特定的成员函数指定为另一个类的友元.哪些函数. ...

How to run a terminal inside of vim?

[How to run a terminal inside of vim?] :sh turn vim into shell mode d+trl back to vim 参考:http://stac ...

linux ps查看进程命令

linux ps查看进程命令ps命令作用:将某个时间点的程序运作情况撷取下来 实例: [root@linux ~]# ps aux [root@linux ~]# ps -lA [root@linux ...

Docker 共有 13 个管理命令和 41 个通用命令,以下是常用 Docker 命令列表

开发人员一直在努力提高 Docker 的使用率和性能,命令也在不停变化.Docker 命令经常被弃用,或被替换为更新且更有效的命令,本文总结了近年来资深专家最常用的命令列表并给出部分使用方法. 目前, ...

如何在疲劳的JS世界中持续学习

作者简介 cnfi 蚂蚁金服·数据体验技术团队 本文翻译自,并对内容有所补充和修改. 部分内容参考

解决UnicodeEncodeError: ‘ascii’ codec can’t encode characters in position

最近用Python写了些爬虫,在爬取一个gb2312的页面时,抛出异常: UnicodeEncodeError: 'ascii' codec can't encode characters in po ...

poj 1321 棋盘问题(n行中放任意k行)

n*n的棋盘摆K的棋子,任意两个棋子不能在同一行同一列 Sample Input 2 1#.  //# 可放.#4 4...#..#..#..#...-1 -1Sample Output 21 # i ...

Js_图片轮换

本文介绍用javascript制作图片轮换效果,原理很简单,就是设置延时执行一个切换函数,函数里面是先设置下面的缩略图列表的白框样式,再设置上面大图的src属性,在IE中显示很正常,可是在FF中会有变 ...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值