Windows平台上使用MinGW GCC编译JNI动态链接库会在Java加载的时候出错,本文简单介绍其中的原因和应对策略。这里只是简单示范如何用MinGW GCC去编译JNI程序

第一步:编写java程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//Test.java
public class Test {public static native void print();static {System.loadLibrary("hello");}public static void main(String[] args) {//打印Java加载DLL文件路径,应该包括当前目录,也就是"."//System.out.//println(System.getProperty("java.library.path"));Test.print();}
}

注意其中的代码: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
/* Test.cpp */
#include "Test.h"
#include <iostream>
using namespace std;JNIEXPORT void JNICALL Java_Test_print(JNIEnv *, jclass)
{cout<<"Cpp,Java and JNI~"<<endl;
}

第五步:创建库文件

前面第一步里面提到过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)相关推荐

  1. [转载]深入Windows NT/2000模块的组织 - 专题安全方向{ Security Research Papers } - 邪恶八进制信息安全团队技术讨论组 努力为祖国的信息安全撑起一片蓝天

    导读: [转载]深入Windows NT/2000模块的组织 文章作者:WebCrazy 信息来源:WebCrazy( http://www.geocities.jp/webcrazyjp/) 深入W ...

  2. 【转载】windows 如何一键关闭所有进程程序 --- (博客园 - 木人子韦)

    [转载]Windows 如何一键关闭所有进程程序 --- (博客园 - 木人子韦) 1.桌面创建一个快捷方式,点击鼠标右键跳出的菜单=> 新建=>快捷方式 01 在"请键入对象的 ...

  3. 转载:Windows核心编程---空指针赋值分区

    空指针赋值分区 为什么通过空指针读写的时候就会出现异常? 除了NULL表示空指针,是否还有其他的值也是空指针? 如果还有其他的值,你们这些表示空指针的值都是什么?为什么? 首先解答第一个问题,在win ...

  4. 【转载】Windows自带.NET Framework版本大全

    转载自:http://blogs.msdn.com/b/astebner/archive/2007/03/14/mailbag-what-version-of-the-net-framework-is ...

  5. 【转载】Windows 10系统默认将画面显示比例调整至125%或150%,最高分辨率已经达到3840×2160(4K)这一级别。...

    高分屏打开软件界面模糊?不会设置太浪费 2017-08-31 19:37 抹又重彩 现在有好多朋友都喜欢并买了高分屏笔记本电脑.高分屏笔记本就是配有高分辨率屏幕的笔记本.为了给用户带来更好的视觉体验, ...

  6. [转载]让Windows Server 2008 + IIS 7+ ASP.NET 支持10万并发请求

    由于之前使用的是默认配置,服务器最多只能处理5000个同时请求,今天下午由于某种情况造成同时请求超过5000,从而出现了上面的错误. 为了避免这样的错误,我们根据相关文档调整了设置,让服务器从设置上支 ...

  7. 转载:Windows Phone 7 资源汇总(超全)

    一些关于WP7开发的资源,记录下来,很受用. 工具,书籍,指南 Windows Phone 7 Developer Tools RTM (online installer) , ISO UI Desi ...

  8. 转载:Windows Mobile 开发资源(精)

    1.Windows Mobile Team Blog 2.Microsoft Technical Forums  -->Smart Device Development -- 强烈推荐 3.微软 ...

  9. 【转载】Windows 7下使用bcdedit删除多余启动项的命令

    在Windows  7中是使用bcdedit来代替Windows XP中的boot.ini bcdedit位置:C:\Windows\System32 (直接使用命令bcdedit即可) bcdedi ...

最新文章

  1. session实现验证码功能
  2. css知识笔记(一)——基础知识、选择器、元素分类
  3. vue-cookies使用方法,vue中使用获取cookie
  4. Android进程间通信(复习笔记)
  5. React中JSX的理解
  6. 实现1-2+3-4+5-6+…+99-100的算法的程序
  7. Redis 常见延迟问题排查手册
  8. 中文文本分类:你需要了解的10项关键内容
  9. 关于区块链通证模型,你想知道的都在这
  10. UDP穿越NAT原理(p2p)
  11. SCT2650,4.5V-60V电压,芯洲降压DCDC转换器,参数
  12. 【LDC1314】电感传感器中文手册与检测原理介绍
  13. 计算机音乐出山,出山 - 萧忆情Alex - 5SING中国原创音乐基地
  14. NS2:添加一个新的流量发生器(poisson分布)
  15. win7系统计算机打不开6,Win7系统打不开ppt文件的六种原因和解决方法
  16. 设计篇:一文分清UIUE
  17. DB 查询分析器 6.03 在Windows 8 上安装与运行演示
  18. Javascript深克隆和浅克隆
  19. Specular/Glossiness传统材质简单转换金属度流程材质metallic/roughness小记
  20. Django开发个人博客网站——12、实现不同大小的标签云样式

热门文章

  1. java如何恢复视图_Java - 如何用reformation+Moshi创建回收站视图_java_酷徒编程知识库...
  2. pc工具不支持stb的加密方式_那些工作中常用的实用工具
  3. vue 毫秒数转年月日_Vue将毫秒数转化为正常日期格式的实例_盂希_前端开发者
  4. sd卡测速工具_怎样恢复SD卡数据?教你两招轻松恢复
  5. python由编译器将源程序转化为机器语言_python初识
  6. 基于 Flow 的 NFT 交易平台 Tibles 完成 114 万美元种子轮融资
  7. 纽交所发言人就“GME事件”表态:采用先进技术监督市场
  8. 风险策略中的五层决策
  9. 中后台管理信息系统通用原型方案、业务中台管理系统、业务中台架构、管理信息系统、订单管理、客户管理、货源管理、财务管理、客服管理、营销管理、办公申请、协作管理、CMS、OA、CRM、ERP、Axure
  10. spring boot(十五)spring boot+thymeleaf+jpa增删改查示例