我正在使用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