注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

不透明的雾的博客

人生是一次记忆的旅行

 
 
 

日志

 
 
 
 

【java】MinGW-GCC 如何编译JNI程序【转】  

2010-12-01 09:27:00|  分类: 技术 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

?本文并非介绍如何编写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 HelloWorld
Hello world! 运行成功,great!

  评论这张
 
阅读(312)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017