JNI头文件生成类

时间:2010-08-12 00:42:00

标签: java class header java-native-interface

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

问题是,JNI将声明原型的Java类的名称附加到头文件中的函数名称,因此我需要为每个Java类ABC单独生成两个头文件, XYZ?

最佳。

2 个答案:

答案 0 :(得分:0)

三个选项:

  1. 从Java调用相同的库方法。
  2. 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中调用相同的库方法。
    2. 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. 自动重复代码。 ;)
      2. 请参阅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