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
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
相关文章推荐
- [JAVA]MinGW-GCC 如何编译JNI程序
- MinGW-GCC 如何编译JNI程序
- MinGW-GCC 如何编译JNI程序进阶
- 如何在notepad++中调用MinGW编译运行程序
- 在Linux下如何使用GCC编译程序、简单生成静态库及动态库
- 在Linux下如何使用GCC编译程序、简单生成静态库及动态库
- Linux操作系统的简单指令及如何使用vim编写一个程序,然后使用gcc查看【预处理】、【编译】、【汇编】、【链接】各阶段文件的内容。
- 在Linux下如何使用GCC编译程序、简单生成静态库及动态库。
- Android NDK编程,我的第一个hello-jni程序,如何调用自己编译的so库
- GCC 64位程序的makefile条件编译心得——32位版与64位版、debug版与release版(兼容MinGW、TDM-GCC)
- 在Linux下如何使用GCC编译程序、简单生成静态库及动态库
- 如何使用指定版本的GCC/G++来编译autotools打包的程序
- andriod eclipse 如何设置ndk-build也即NDK自动编译C/C++、JNI程序
- GCC 64位程序的makefile条件编译心得——32位版与64位版、debug版与release版(兼容MinGW、TDM-GCC)
- 在Linux下如何使用GCC编译程序、简单生成静态库及动态库。
- 在Linux下如何使用GCC编译程序、简单生成静态库及动态库。
- GCC 64位程序的makefile条件编译心得——32位版与64位版、debug版与release版(兼容MinGW、TDM-GCC)
- 用mingw编译C++工程;程序里面的cout<<"aaa";cmd运行c++程序,aaa内容在控制台不显示,如何将aaa输出到控制台屏幕并将控制台内容写到一个文件中。
- GCC—C程序是如何编译成的 -windows
- 在Linux下如何使用GCC编译程序、简单生成静态库及动态库。