2015-08-18 20 views
0

我想有些事情出與JNI和我發現了以下問題:加載通過AndroidfromJNI一個靜態無效的C函數另一個包

如果我想使用Java中的原生功能我加載所需的lib,在其中所需的函數存儲,經由

static{ 
    System.loadLibrary("lib"); 
} 

並使用

native private static int calculate(byte[] numberArray); 

聲明在java文件的原始方法。在程序本身,我可以用這個功能來計算的東西:

int result = calculate(array); 

這只是工作,如果我編譯與JAVAH創建的頭文件的共享對象,使每個功能被命名爲在C面爲:

static void Java_com_packagename_File_calculate(const void* array, void* result){ 
    code[...] 
} 

如果我將Java代碼中的引用(「native [[...] calculate [...]」)刪除到這個c函數中;有沒有可能通過java訪問/執行仍然存在的c代碼(當然不用編輯現有的文件;-))例如通過反射或繼承?或者是有什麼樣可能的。

public class NewClass{ 

    public int nativeCheater(){ 
    System.loadLibrary("lib"); 
    native private static int Java_com_packagename_File_calculate; 
    }   
} 

,我想用一個全新的類沒有任何關係,現有二手包com.packagename是很重要的(文件)。

在此先感謝:-)

回答

1

沒有,但您可以創建具有相同的包和類名的新類和訪問同一個本地方法。新班級可以公開這種方法。

另一種方法是通過Jni_OnLoad()和RegisterNatives()使用動態綁定。這樣,你的本地實現可以綁定到任何Java類,甚至不止一個。

但是,如果你有機會既沒有Java類也不是天然來源,你總是可以創建自己的本地方法,在自己的類,並且內部Ç顯式調用原:

static void Java_com_mypackagename_File_calculate(const void* array, void* result) {  
    Java_com_packagename_File_calculate(array, result); 

}

+0

感謝您的快速響應。我試圖通過URLClassLoader添加一個新類,但我無法使用新類。如果我使用(加載後)Class.forName(「com.package.File」)。getDeclaredMethods()我收到一個包含舊文件的方法的數組。你可以提供一個代碼樣本嗎? – rudolf

+0

我不認爲Android JVM允許兩次使用相同的全名加載兩個類。我的答案意味着你使用新的類*而不是原來的。 'RegisterNatives()'方法可以工作,但是這需要訪問本地代碼。另一方面,如果你既沒有訪問Java類,也沒有訪問本地源,我爲你添加了第三種方法。 –

相關問題