2010-08-12 78 views
0

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

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

最好。

回答

0

三个选项:从Java

  1. 调用同一个库的方法。

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

  • 呼叫相同的库从C /装配的方法。
  •  
    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

    +0

    谢谢你的答复ers :) – sparkFinder 2010-08-13 19:24:36

    0

    望着从另一个角度来看这个问题......没有包括几类单一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

    +0

    所以 - 我不需要包含'myPackageBoo'的头文件,但只需要jni.h?只要我得到由机器生成的头文件指定的确切原型? – sparkFinder 2010-08-17 01:01:57