我目前正在使用JNI为Java类ABC中使用的本机方法生成C头。但是,我想在其他地方使用这些方法,在另一个类XYZ中,因此我创建了一个名为cLib的类,它基本上只有原生方法的原型,并在生成时为我提供了我需要的方法的头文件
问题是,JNI将声明原型的Java类的名称附加到头文件中的函数名称,因此我需要为每个Java类ABC单独生成两个头文件, XYZ?
最佳。
答案 0 :(得分:0)
三个选项:
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
答案 1 :(得分:0)
从另一个角度来看问题......在用于构造“libPOW.so”的单个LIB.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