1我需要放置機方法簽名在同 包/班那些定義的時候。因此,或者我可以在我的項目中的任何程序包/類中使用此 簽名,因此在運行時期間,jvm將能夠在共享庫中找到該方法?
根據http://docs.oracle.com/javase/6/docs/technotes/guides/jni/spec/design.html,您必須使用匹配的包和類名稱。
我只觀察到JNI方法,其中C端函數被稱爲諸如Java_com_company_whatever_SomeClass_someMethod之類的東西,這意味着您必須將「本機」聲明放入類似名稱的Java類中。
使用工具「nm」或「nm ++」(它們位於NDK中的預編譯文件夾中)查看.so文件並查看其中定義的函數的調用。如果你看到任何啓動的Java_,那就是你想要的。
我對前面的聲明持懷疑態度,您可以調用未在Java_PACKAGE_CLASS_METHOD格式中命名的函數;如果它真的有效,它可能是一種遺留行爲,但即使可以,它看起來也很危險 - 你可能會得到錯誤的結果。
2我在哪裏需要將這個.so文件放在我的eclipse android 項目中以便將此文件部署到我的apk文件中?
你。所以住在庫/取決於你有多少與平臺,其中「庫」是一個對工作armeabi,庫/ armeabi-V7A,庫/ X86,和/或庫/ MIPS 'src'和'res'。我不知道Android是否在libs /沒有平臺限定符的情況下查找,但沒有明顯的好處。大多數/所有英特爾設備的情況稍微複雜一些,包括花哨的技術,允許他們在x86硬件上執行大多數ARM庫。另外,我喜歡聲明一個JNI類的接口並提供一個工廠(這裏是一個簡潔的方法,但我更喜歡一個工廠類),如果事情出錯,它會提供一個無操作接口的實現:它便於進行單元測試,並且避免在調用其方法之前必須混淆空值的測試(假定您感到滿意,您發佈的庫永遠不會丟失或更改方法簽名 - 您的集成測試應該檢查它):
public interface YourLibI {
@Override
public native yourMethod();
public static final NO_OP = new YourLibI() {
@Override
public void yourMethod(){}
}
}
public class YourLib extends YourLibI {
public newYourLibI() {
try {
return new YourLib();
}
catch (UnsatisfiedLinkError e) {
Log.e("YourLibJNI", "Load failed, returning NO-OP dummy", e);
return YourLibI.NO_OP;
}
}
static {
System.loadLibrary("arbitronSDK");
}
private YourLib() {
}
@Override
public native void yourMethod();
}
我通常不會調用接口'xxx',但我假設您的庫的JNI類不像UtilityJNI那樣被調用(因此我會調用接口'Utility')。
謝謝@Sujit。我在看這個教程,http://www.android10.org/index.php/articlesother/276-call-c-code-from-application-using-ndk,我看到生成的C++代碼片段有方法名由java包和方法名組成。這不會影響我使用本地簽名的方式嗎?我希望我應該遵循共享庫創建時使用的相同名稱約定。另一個問題,一旦我在我的AndroidProject/lib文件夾中有.so文件,這個文件將與APK文件一起導出嗎?我是否需要創建子文件夾armeabi文件夾?非常感謝,T – Thiago