... from the link
HelloWorld.java
class HelloWorld
{
public native int[][] multiply(int A[][], int B[][]);
static
{
System.loadLibrary("HelloWorldImp");
}
public static void main(String[] args)
{
HelloWorld test = new HelloWorld();
int[][] A = new int[5][5];
int[][] B = new int[5][5];
int[][] result = test.multiply(A, B);
System.out.println(result[0][0]);
}
}
然後使用 javac HelloWorld.java 產生出 HelloWorld.class
接下來再使用 javah HelloWorld 產生出 HelloWorld.h
HelloWorld.h
/* DO NOT EDIT THIS FILE - it is machine generated */
#ifndef __HelloWorld__
#define __HelloWorld__
#include
#ifdef __cplusplus
extern "C"
{
#endif
JNIEXPORT jobjectArray JNICALL Java_HelloWorld_multiply (JNIEnv *env, jobject, jobjectArray, jobjectArray);
#ifdef __cplusplus
}
#endif
#endif /* __HelloWorld__ */
再把 HelloWorld.c 寫出來
HelloWorld.c
#include "HelloWorld.h"
JNIEXPORT jobjectArray JNICALL Java_HelloWorld_multiply (JNIEnv *env, jobject obj, jobjectArray A, jobjectArray B);
{
jobjectArray C;
...
return C;
}
最後使用 gcc -Wall -g -shared -fPIC HelloWorld.c -o libHelloWorldImp.so
現在終於可以執行 Java 程式了
java -Djava.library.path=./ HelloWorld
使用 Java 來做跨平台程式開發
在關鍵部份再利用 JNI 來將平台特性最佳化
1 則留言:
你好呀,
剛巧我最近弄一個也是Java與C++混合編程,不過並沒有JNI,而是用GCJ的CNI介面,原因這是在Google裏找到的第一個方案。
使用的程序與你所寫的差不多,不過在Debian SID的環境下就有很多問題,例如說gcjh產生不到標題檔;有些Java class的表現也是怪怪的,比方說ImageIO,只會回傳null object。
反而Etch就沒有這些問題
張貼留言