2012-05-13 80 views
4

我有一個Ability.h文件依賴於Effect.h文件。Android NDK - 在不同的頭文件中包含一個C++頭文件?

我需要使用JAVAH生成我的頭,但我無法定義我Ability.java類的效果依賴從中我想生成的C++頭。

實施例:

public class Ability { 

    static { 
    System.loadLibrary("com_test_Effect"); 
    System.loadLibrary("com_test_Ability"); 
    } 

    public native Effect foo(Effect x); 

} 

此代碼生成一個* h文件而不foo()功能,因爲如果不能識別它。如果我將返回類型交換爲int並且不包含com_test_Effect,它會生成適當的文件。

我確實有Android.mk文件中定義的兩個模塊(com_test_Effect和com_test_Ability)。

如何將另一個C++文件直接包含在由javah生成類的Xyz.java類中?

編輯:問題也可以這樣問:有沒有一種方法來傳遞C++類型的參數或從C++和Java之間的接口函數返回C++類型的值? (接口介質是JNI。)例如,您可以使用像int這樣的基本類型來完成此操作,然後將其轉換爲jint,等等。

+0

「不包括com_test_Effect」。這部分沒有效果。你不是'包括'任何東西,你在運行時加載庫。它對Java編譯器或'javah'沒有任何不可思議的影響。我會問你有沒有編譯過「效果」類? – EJP

+0

@EJP是的,該效果是編譯的,但只是因爲它不依賴於任何東西。我想知道如何在Xyz.java中使用C++類型,這樣javah就可以生成一個合適的* .h文件。 – ScarletAmaranth

+0

@EJP假設我不想在那裏使用「Effect」,但使用std :: string。鑑於stl已啓用,我仍然無法包含標題。那麼,我可以在* .cpp文件中完成,而不是在C++頭文件中完成。 – ScarletAmaranth

回答

-1

什麼返回一個對象:

private native Object fooNative(Object x); 

然後將其轉換使之具有相同簽名:

public Effect foo(Effect x) { 
    return (Effect)fooNative(x); 
}