我想有些事情出與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是很重要的(文件)。
在此先感謝:-)
感謝您的快速響應。我試圖通過URLClassLoader添加一個新類,但我無法使用新類。如果我使用(加載後)Class.forName(「com.package.File」)。getDeclaredMethods()我收到一個包含舊文件的方法的數組。你可以提供一個代碼樣本嗎? – rudolf
我不認爲Android JVM允許兩次使用相同的全名加載兩個類。我的答案意味着你使用新的類*而不是原來的。 'RegisterNatives()'方法可以工作,但是這需要訪問本地代碼。另一方面,如果你既沒有訪問Java類,也沒有訪問本地源,我爲你添加了第三種方法。 –