[英]How to build JNI DLL that calls function from another DLL? - JNI, Gradle
[英]How to add prefixes to jni dll function names
我有一個jni dll,它具有從Java調用的功能。 問題在於此dll在默認包中(在DLL“ Java_classname_methodname”中)具有所有Java類。 無法獲取此dll的源,並且重寫將花費很長時間。 因此,我基本上需要在與默認軟件包不同的包中從Java調用此dll中的函數。 我已經嘗試了好幾個小時,用一個十六進制編輯器重命名了dll中的函數,並使用了幾個工具來修改dll中的校驗和和地址,但這對我來說實在太多了,因為我對此幾乎沒有經驗。 我非常喜歡這條路線,但是我只是沒有合適的工具或專門知識。 所以我剩下的就是嘗試用Java硬編碼包名稱。 我嘗試按照此堆棧溢出文章中的描述使用jna來執行以下操作:
Map options = new HashMap();
options.
put(
Library.OPTION_FUNCTION_MAPPER,
new StdCallFunctionMapper() {
public String getFunctionName(NativeLibrary library, Method method) {
method.setName(method.getName().replace("com.test.", "");
return super.getFunctionName(library, method);
}
}
);
Native.loadLibrary(..., ..., options);
但是Method中沒有setName。 理想情況下,我想在不使用任何額外庫的情況下完成此任務,但是我顯然不反對使用jna之類的東西。 而且在任何人問之前,是的,這是圖書館使用許可所允許的。 請不要告訴我這是不可能的,因為知道這是可能的,只是很難。 無論哪種方式都必須完成,我願意投入工作(修改dll或將Java代碼與某些外部庫一起使用)。 順便說一句,我最終還需要在.so和.dylib文件上完成此操作(不如dll重要)。 感謝您的時間。
我有一個JNI dll,它具有從Java調用的功能。 問題在於此DLL在默認包(在DLL“ Java_classname_methodname”中)中具有所有java類。
因此,帶有本機方法的相應Java類也不在包中。
無法獲取此dll的源,並且重寫將花費很長時間。 因此,我基本上需要在與默認軟件包不同的包中從Java調用此dll中的函數。
正確。
我已經嘗試了好幾個小時,用一個十六進制編輯器重命名了dll中的函數,並使用了幾個工具來修改dll中的校驗和和地址,但這對我來說實在太多了,因為我對此幾乎沒有經驗。
您也許可以以某種方式為函數名稱起別名,但是距我在該領域練習已有20年了。
我非常喜歡這條路線,但是我只是沒有合適的工具或專門知識。 所以我剩下的就是嘗試用Java硬編碼包名稱。
否。沒有要硬編碼的程序包名稱。 剩下的就是嘗試從包中的類中調用沒有包的類中的本機方法,因為1.4是不可能的。
您需要做的是:
要么
如下:
RegisterNatives
方法在新的本機方法名稱和簽名下在舊的DLL中注冊現有的JNI入口點。 javah
獲取所需的本機方法名稱,並使用javap
獲取所需的Java簽名。 不要試圖用手猜測它們。 不要問我這是如何映射到.so文件的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.