您的位置:首页 > 其它

MinGW-GCC 如何编译JNI程序

2012-02-13 13:56 465 查看
第一步:编写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 HelloWorld

Hello world! 运行成功,great  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐