簡體   English   中英

如何在JNI DLL函數名稱中添加前綴

[英]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是不可能的。

您需要做的是:

  1. 可以通過反射調用無包Java本機方法。 因此,您可以編寫一個做到這一點的包裝器類,該類位於您選擇的包中,其余代碼可以調用包裝器。

要么

  1. 如下:

    • 使用適當的本機方法在您選擇的包中編寫另一個Java類。
    • 從現有的DLL創建一個導入庫。
    • 編寫另一個DLL並將其與此導入庫鏈接。
    • 從Java代碼加載此新DLL。
    • 讓此DLL在初始化時使用RegisterNatives方法在新的本機方法名稱和簽名下在舊的DLL中注冊現有的JNI入口點。
    • 使用javah獲取所需的本機方法名稱,並使用javap獲取所需的Java簽名。 不要試圖用手猜測它們。

不要問我這是如何映射到.so文件的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM