2012-06-20 68 views
1

我有出口的函數的格式如下一個.dll庫:如何產生特定的JNI頭

_Java_folder1_folder2_folder3_JavaClassName_javamethodname @ 16

我不能修改該.dll。它給了我。

我需要編寫一個java程序來調用本地javamethodname。但是,我無法生成正確的頭文件。如何用上面指定的簽名生成頭文件?

我試過javah -jni JavaClassName,但它沒有給我想要的結果。當我打電話JAVAH從目錄層次結構裏面,我得到一個頭,如:

Java_JavaClassName_javamethodname

當我試圖從目錄層次結構之外的電話JAVAH,我得到一個錯誤。

另外,如何獲得Java前面的頭部簽名中的下劃線?那就是:_Java不是Java。

謝謝!

+1

爲什麼?您已經擁有Java類和DLL。這就是你需要的。只需編寫調用Java類的Java代碼即可。 – EJP

+0

是啊,你爲什麼需要標題?你需要的是Java本地類,你應該能夠從任何JAR文件調用DLL中提取它。 –

+0

我設法調用.dll。但是,在那裏似乎有一些軟件保護,它檢查某些變量是否被初始化,以及某些類是否被加載。似乎也有更多的,因爲我不能得到預期的輸出:( – skyknight

回答

1

編寫Java代碼很簡單:你創建一個Java項目,包名folder1.folder2.folder3,把你的JavaClassName類有一個native javamethodname。您不需要生成頭文件或任何東西,已經由創建該DLL的人完成,並且具有與重構相同的類。

The Java_ prefix is standard並且由JVM-JNI鏈接器添加,您不需要關心它。

但是,我讀的行之間,你也有問題,領導下劃線。這是一個「編譯器裝飾」,如果你只有DLL(沒有源代碼,不需要重新編譯),你可能會註定失敗。各種編譯器添加各種「裝飾」,以確保您不會混淆調用者(JVM)和被調用者(DLL)之間的調用約定。它有一些observable default behavior,可能會被various compiler options和/或定義文件(MSVC上的.def)所損壞。這兩個都不適用於你的情況。因此,你需要:

  1. 找出編譯器用於產生DLL
  2. 查找針對給定的編譯器只能通過JVM具有產生你的觀察符號裝飾
  3. 你的DLL是可運行的調用約定定義爲JNICALL宏的相同調用約定$JAVA_HOME/include/your_platform/jni_md.h
+0

謝謝!我會檢查的。 – skyknight

1

將Java類放入包folder1.folder2.folder3中。

C源代碼將被命名爲「Java_folder1_folder2_folder3_JavaClassName_javamethodname」,不帶下劃線。

您需要確定本機方法期望的參數。

+0

如何在包上調用javah?如何獲得前面的下劃線在Java前,像_Java?謝謝! – skyknight

+0

@skyknight - 運行'javah'會對你沒有好處。'javah'對Java原生類進行操作,生成一個.h文件來編譯本地方法。你已經有了編譯好的本地方法。 –

+0

在javah命令中,你還需要當你編譯DLL的時候,你會看到下劃線,也就是說,你已經有了一個DLL,如果你已經有了這個DLL,爲什麼還需要一個頭文件? –

0

如果DLL本身沒有與相應的Java類一起提供本機方法聲明,則它是不完整的,可能100%無用。您不應該期望對此進行逆向工程。它甚至可能被錯誤地構建。在我進一步討論這個之前,我會要求證明它是有效的。這些證據必須包括Java部分;否則它不是證據。

+0

.dll在從eclipse插件中調用時運行良好。因此,它很好。 proble m是我必須爲它寫一個命令行界面。 Eclipse會做一些奇怪的事情。 – skyknight

+1

@skyknight如果你已經有DLL和Java類,我不明白你爲什麼需要重新生成任何東西。 – EJP

+0

實際上再生有助於調試更容易。如果標題與.dll中的預期函數調用不匹配,則不會運行。 – skyknight