`
ezerg
  • 浏览: 268984 次
  • 性别: Icon_minigender_1
  • 来自: 石家庄
社区版块
存档分类
最新评论

XP 下 Java 本地接口调用 MinGW 编译的动态库

阅读更多


Java 程序可以“一次编写,到处运行”,原因是它运行在 Ja va 虚拟机上。
正是由于这个原因,它的执行效率也会相应打些折扣,特别是一些与操作系统连接比较紧密的操作。
所以 Java  也提供了本地接口,以便直接调用其它更高效的程序接口,例如 C 、C ++ 等等。
MinGW 是一个运行在 Windows 平台的 C 、C ++ 编译器,支持 Make 、Gdb 等类似 Linux 环境下 GCC 的功能。
下面演示一下用 MinGW 将 C 程序编译成动态链接库,再使用 Java 的本地方法调用 C 程序中的函数。

1、创建 Java 类文件并声明本地接口

package testnative; //未定义包名会调用时会出现 java.lang.UnsatisfiedLinkError
public class CheckFile {

	static {// 动态库名称为 test.dll
		System.loadLibrary("test");
	}
	// 本地方法名称
	public native void printHello();
	
	public static void main(String[] args) {
		try {// 测试运行
			new CheckFile().printHello();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}


2、根据 CheckFile 自动生成 C ++ 头文件 testnative_CheckFile.h
> javah -classpath . -jni testnative.CheckFile

3、根据头文件 testnative_CheckFile.h 编写 C ++ 程序

#include "CheckFile.h"
#include <iostream>

using namespace std;

JNIEXPORT void JNICALL Java_testnative_CheckFile_printHello (JNIEnv *e, jobject o) {
    cout << "hello" << endl;
}


4、编译 C ++ 程序为动态链接库 test.dll
注意 JDK 的路径
> g++ -ID:\tools\jdk1.6.0_16\include -ID:\tools\jdk1.6.0_16\include\win32 -fPIC -Wall -g -c CheckFile.cpp

生成 CheckFile.o 文件后,再生成动态链接库 test.dll
> g++ -shared -Wl,--kill-at -o test.dll CheckFile.o

5、测试执行
> java -Djava.library.path=. -cp . testnative.CheckFile



0
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics