« | August 2025 | » | 日 | 一 | 二 | 三 | 四 | 五 | 六 | | | | | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | | | | | | | |
|
|
[JAVA]MinGW-GCC 如何编译JNI程序 |
冥思者 发表于 2006/3/22 13:44:16 |
本文并非介绍如何编写JNI程序,相关资料可以参考java tutorial。这里只是简单示范如何用MinGW-GCC去编译JNI程序。第一步:编写java程序public class HelloWorld { public native void displayHelloWorld(); static { System.loadLibrary("hello"); } public static void main(String[] args) throws Exception { new HelloWorld().displayHelloWorld(); }}注意其中的代码
public native void displayHelloWorld();
就是声明displayHelloWorld()这个方法是本地方法,需要在jni中实现。
static {
System.loadLibrary("hello");
}
意思是载入库文件,意味着我们下面的jni程序最终需要打包成hello.dll第二步:编译java程序javac HelloWorld.java第三步:生成头文件javah -jni HelloWorld第四步:编写本地实现代码我们打开第三步生成的HelloWorld.h这个文件,找到其中的方法声明JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld (JNIEnv *, jobject);这是jni的命名规范,具体可以参考java tutorial。这里只是方法声明,现在我们来实现它。/* HelloWorldImp.c */#include <jni.h>#include "HelloWorld.h"#include <stdio.h>JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld(JNIEnv *env, jobject obj) { printf("Hello world!\n"); return;}第五步:创建库文件前面第一步里面提到过hello.dll,这里利用以前提到的制作动态库的命令来生成它。gcc -I%JAVA_HOME%\include -I%JAVA_HOME%\include\win32 -shared -o hello.dll HelloWorldImp.c运行java HelloWorld不好,出错了Exception in thread "main" java.lang.UnsatisfiedLinkError: displayHelloWorld at HelloWorld.displayHelloWorld(Native Method) at HelloWorld.main(HelloWorld.java:9)意思是库文件已经成功载入了,但是没有找到相匹配的displayHelloWorld这个方法。可是我们明明实现了这个方法的呀?原来程序在调用动态库的时候,没有我们想象中的那么简单,而且不同的编译器做法不一样,windows版java中调用jni遵从的是vc的调用方式,和我们用的MinGW GCC默认格式不一致。我们需要调整一下参数,(注意其中的--kill-at)gcc -I%JAVA_HOME%\include -I%JAVA_HOME%\include\win32 -shared -Wl,--kill-at -o hello.dll HelloWorldImp.c运行
java HelloWorldHello world! 运行成功,great! | |
|
回复:MinGW-GCC 如何编译JNI程序 |
书树(游客)发表评论于2007/10/24 21:15:30 |
太感谢了。我弄了两三个小时,还是你这里解决了我的问题,其实也怀疑到是gcc和vc不一致的原因,只是这方面资料太少。 so, thanks for you | |
|
回复:MinGW-GCC 如何编译JNI程序 |
haha(游客)发表评论于2007/5/16 14:36:32 |
谢谢你,我也是同样的问题,找了好久,不知道原因,哈哈 | |
|
» 1 »
|
|
统计 |
blog名称:长夜慢慢兮,心越来越远! 日志总数:13 评论数量:48 留言数量:1 访问次数:154047 建立时间:2006年3月3日 | |