转载JNI(Windows)
Windows平台上使用MinGW GCC编译的JNI动态链接库会在Java加载的时候出错,本文简单介绍其中的原因和应对策略。这里只是简单示范如何用MinGW GCC去编译JNI程序。
第一步:编写java程序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
注意其中的代码:public static native void print();
意思是声明print()这个方法是本地方法而且是静态方法哦,需要在jni中实现。
static{ System.loadLibrary("hello");
}
意思是载入库文件,意味着我们下面的jni程序最终需要打包成hello.dll
第二步:编译java程序
javac Test.java
第三步:生成头文件
javah -classpath .\bin -d src Test
-classpath .\bin是指定Test.class文件在当前目录的子目录bin里面
-d src 是指把生产的Test.h文件放到当前目录下的src子目录下面
第四步:编写本地实现代码
我们打开第三步生成的Test.h这个文件,找到其中的方法声明:
JNIEXPORT void JNICALL Java_Test_print(JNIEnv *, jobject);
这是jni的命名规范,具体可以参考java tutorial。这里只是方法声明,现在我们来实现它。
1 2 3 4 5 6 7 8 9 |
|
第五步:创建库文件
前面第一步里面提到过hello.dll,这里利用以前提到的制作动态库的命令来生成它:
g++ -I%JAVA_HOME%\include -I%JAVA_HOME%\include\win32 -shared -o hello.dll Test.cpp
运行:java Test
不好,出错了:
Exception in thread "main" java.lang.UnsatisfiedLinkError: print
at Test.print(Native Method)
at Test.main(HelloWorld.java:11)
意思是库文件已经成功载入了,但是没有找到相匹配的print这个方法。可是我们明明实现了这个方法的呀?原来程序在调用动态库的时候,没有我们想象中的那么简单,而且不同的编译器做法不一样,windows版java中调用jni遵从的是vc的调用方式,和我们用的MinGW GCC默认格式不一致。我们需要调整一下参数,(注意其中的–kill-at):
g++ -I%JAVA_HOME%\include -I%JAVA_HOME%\include\win32 -shared -Wl,--kill-at -o hello.dll Test.cpp
如果你在程序里面没有使用了C++的函数库,那么把g++换成gcc就可以了。另外,也可以把jni.h jni_md.h两个文件拷贝到源文件目录下面,这样的话就可以不用指定-I参数了,编译也更方便一些。例如,我把Test.h,Test.cpp和jni.h jni_md.h放在一起,然后可以使用命令:
g++ -shared -Wl,--kill-at -o hello.dll Test.cpp
运行:java Test
显示:Cpp,Java and JNI~
运行成功!
转载于:https://www.cnblogs.com/diyunpeng/archive/2010/03/19/1689715.html
转载JNI(Windows)相关推荐
- [转载]深入Windows NT/2000模块的组织 - 专题安全方向{ Security Research Papers } - 邪恶八进制信息安全团队技术讨论组 努力为祖国的信息安全撑起一片蓝天
导读: [转载]深入Windows NT/2000模块的组织 文章作者:WebCrazy 信息来源:WebCrazy( http://www.geocities.jp/webcrazyjp/) 深入W ...
- 【转载】windows 如何一键关闭所有进程程序 --- (博客园 - 木人子韦)
[转载]Windows 如何一键关闭所有进程程序 --- (博客园 - 木人子韦) 1.桌面创建一个快捷方式,点击鼠标右键跳出的菜单=> 新建=>快捷方式 01 在"请键入对象的 ...
- 转载:Windows核心编程---空指针赋值分区
空指针赋值分区 为什么通过空指针读写的时候就会出现异常? 除了NULL表示空指针,是否还有其他的值也是空指针? 如果还有其他的值,你们这些表示空指针的值都是什么?为什么? 首先解答第一个问题,在win ...
- 【转载】Windows自带.NET Framework版本大全
转载自:http://blogs.msdn.com/b/astebner/archive/2007/03/14/mailbag-what-version-of-the-net-framework-is ...
- 【转载】Windows 10系统默认将画面显示比例调整至125%或150%,最高分辨率已经达到3840×2160(4K)这一级别。...
高分屏打开软件界面模糊?不会设置太浪费 2017-08-31 19:37 抹又重彩 现在有好多朋友都喜欢并买了高分屏笔记本电脑.高分屏笔记本就是配有高分辨率屏幕的笔记本.为了给用户带来更好的视觉体验, ...
- [转载]让Windows Server 2008 + IIS 7+ ASP.NET 支持10万并发请求
由于之前使用的是默认配置,服务器最多只能处理5000个同时请求,今天下午由于某种情况造成同时请求超过5000,从而出现了上面的错误. 为了避免这样的错误,我们根据相关文档调整了设置,让服务器从设置上支 ...
- 转载:Windows Phone 7 资源汇总(超全)
一些关于WP7开发的资源,记录下来,很受用. 工具,书籍,指南 Windows Phone 7 Developer Tools RTM (online installer) , ISO UI Desi ...
- 转载:Windows Mobile 开发资源(精)
1.Windows Mobile Team Blog 2.Microsoft Technical Forums -->Smart Device Development -- 强烈推荐 3.微软 ...
- 【转载】Windows 7下使用bcdedit删除多余启动项的命令
在Windows 7中是使用bcdedit来代替Windows XP中的boot.ini bcdedit位置:C:\Windows\System32 (直接使用命令bcdedit即可) bcdedi ...
最新文章
- session实现验证码功能
- css知识笔记(一)——基础知识、选择器、元素分类
- vue-cookies使用方法,vue中使用获取cookie
- Android进程间通信(复习笔记)
- React中JSX的理解
- 实现1-2+3-4+5-6+…+99-100的算法的程序
- Redis 常见延迟问题排查手册
- 中文文本分类:你需要了解的10项关键内容
- 关于区块链通证模型,你想知道的都在这
- UDP穿越NAT原理(p2p)
- SCT2650,4.5V-60V电压,芯洲降压DCDC转换器,参数
- 【LDC1314】电感传感器中文手册与检测原理介绍
- 计算机音乐出山,出山 - 萧忆情Alex - 5SING中国原创音乐基地
- NS2:添加一个新的流量发生器(poisson分布)
- win7系统计算机打不开6,Win7系统打不开ppt文件的六种原因和解决方法
- 设计篇:一文分清UIUE
- DB 查询分析器 6.03 在Windows 8 上安装与运行演示
- Javascript深克隆和浅克隆
- Specular/Glossiness传统材质简单转换金属度流程材质metallic/roughness小记
- Django开发个人博客网站——12、实现不同大小的标签云样式
热门文章
- java如何恢复视图_Java - 如何用reformation+Moshi创建回收站视图_java_酷徒编程知识库...
- pc工具不支持stb的加密方式_那些工作中常用的实用工具
- vue 毫秒数转年月日_Vue将毫秒数转化为正常日期格式的实例_盂希_前端开发者
- sd卡测速工具_怎样恢复SD卡数据?教你两招轻松恢复
- python由编译器将源程序转化为机器语言_python初识
- 基于 Flow 的 NFT 交易平台 Tibles 完成 114 万美元种子轮融资
- 纽交所发言人就“GME事件”表态:采用先进技术监督市场
- 风险策略中的五层决策
- 中后台管理信息系统通用原型方案、业务中台管理系统、业务中台架构、管理信息系统、订单管理、客户管理、货源管理、财务管理、客服管理、营销管理、办公申请、协作管理、CMS、OA、CRM、ERP、Axure
- spring boot(十五)spring boot+thymeleaf+jpa增删改查示例