繁体   English   中英

JNI标头文件生成类

[英]JNI Header file generating class

我目前正在使用JNI为Java类ABC中使用的本机方法生成C标头。 但是,我想在其他类XYZ中的其他地方使用这些方法,因此我制作了一个名为cLib的类,该类基本上只有本机方法的原型,并且在生成时为我提供了所需方法的头文件。 。

问题是,JNI将在原型文件中声明了原型的Java类的名称附加到头文件中的函数名称,所以我是否需要为每个Java类ABC,XYZ分别生成两个头文件?

最好。

三种选择:

  1. 从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... */

  1. 从C / Assembly调用相同的库方法。


public class Boo {
public V native doSomething(...);
}
public class Wow {
public V native doSomething(...);
}
/** Both JNI methods call same C/Assembly native function, similarly... */

  1. 自动复制代码。 ;)

参见java.lang.Compiler

干杯,leoJava

从另一个角度看问题……在用于构造“ 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM