2010-08-12 92 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