我正在使用JNI爲在Java類ABC中使用的本機方法生成C頭。然而,我想在另一個類XYZ中使用這些方法,因此我創建了一個名爲cLib的類,它基本上只有原生方法的原型,並且在生成時爲我提供了所需方法的頭文件。JNI頭文件生成類
問題是,JNI將原型聲明的Java類的名稱附加到頭文件中函數的名稱中,所以我需要爲每個Java類分別生成兩個頭文件ABC ,XYZ?
最好。
我正在使用JNI爲在Java類ABC中使用的本機方法生成C頭。然而,我想在另一個類XYZ中使用這些方法,因此我創建了一個名爲cLib的類,它基本上只有原生方法的原型,並且在生成時爲我提供了所需方法的頭文件。JNI頭文件生成類
問題是,JNI將原型聲明的Java類的名稱附加到頭文件中函數的名稱中,所以我需要爲每個Java類分別生成兩個頭文件ABC ,XYZ?
最好。
三個選項:從Java
public class Boo {
public V doSomething(...) {
return (Common.doSomething(...));
}
}
public class Wow {
public V doSomething(...) {
return (Common.doSomething(...));
}
}
public class Common {
public static native V doSomething(...);
}
/** Trivial JNI Implementation omitted... */
public class Boo {
public V native doSomething(...);
}
public class Wow {
public V native doSomething(...);
}
/** Both JNI methods call same C/Assembly native function, similarly... */
看到java.lang.Compiler
乾杯, leoJava
望着從另一個角度來看這個問題......沒有包括幾類單一LIB本地代碼的問題。用於構建「libPOW.so」的c文件。
考慮的一個文件 「LIB.c」 以下內容:
/* Common Header Files... including jni.h / /
* Class: your.pkg.Boo
* Method: doSomething
* Signature: (I)I
*/
JNIEXPORT jint JNICALL Java_your_pkg_Boo_doSomething(
JNIEnv env, jobject jobj, jint job) { ... } /
* Class: your.pkg.Wow
* Method: doSomething
* Signature: (I)I
*/
JNIEXPORT jint JNICALL Java_your_pkg_Wow_doSomething(
JNIEnv *env, jobject jobj, jint job)
{
...
}
然後編譯通過:
$(CC) $(CCOPTS) [$(CCOPTS64)] $(JAVAOPTS) LIB.c -o libPOW.so
其中:
CCOPTS == "-G -mt" (solaris) OR "-Wall -Werror -shared -shared-libgcc -fPIC" (Linux)
CCOPTS64 == "-xcode=pic32 -m64" (SparcV9) OR "-m64" (AMD64)
JAVAOPTS == "-I$(JAVA_HOME)/include -I$(JAVA_HOME)/include/$(OSNAME) -I."
乾杯, leoJava
所以 - 我不需要包含'myPackageBoo'的頭文件,但只需要jni.h?只要我得到由機器生成的頭文件指定的確切原型? – sparkFinder 2010-08-17 01:01:57
謝謝你的答覆ers :) – sparkFinder 2010-08-13 19:24:36