我正在從一個需要從dll文件調用某些方法的項目中工作。 這兩個DLL是JNI使用本機方法
- EasySign.dll
- EasySignJNI
EasySignJNI取決於EasySign。
我寫的類加載EasySignJNI如下:
package easysign;
class EasySign {
EasySign(){}
public native String EasyHashFile(String filename);
public native int EasySign(String pkcs11_driver,String pin, int type, String file_data, int out_format, String signed_file, String cert_out, int cert_format);
public native int EasyVerify(String cert_user, String file_data, String signed_file, String crl_file, String ca_file, String out_document);
static {
System.loadLibrary("EasySignJNI");
}
}
現在我把這些方法從我的主要方法是這樣的:
public class Test {
public static void main(String[] args) throws IOException{
EasySign es = new EasySign();
System.out.println("EasyHashFile : " + es.EasyHashFile("test.txt"));
}
}
什麼我在-Djava.library.path
指定?只有我的EasySignJNI.dll所在的路徑?用這種方法可以調用本地方法嗎? 我使用NetBeans來實現完整性。
編輯: 我注意到,第三方dll提供給我(特別是JNI dll)沒有任何包定義方法名稱,所以我不得不把類加載到默認包的類。有沒有辦法只改變dll方法名稱,包括我自己的包名?
編輯2: 我的意思是EasySign.dll和EasySignJNI.dll都是我自己提供的,我無法修改它們(我沒有源代碼)。 EasySignJNI是JNI部分,但檢查它我已經注意到方法標誌的形式爲:_java_EasySign_MethodName。當我從我的Easysign類加載Java中的dll(該類必須位於「mypackage」包中)時,我收到jni unsatisfiedlinkerror,因爲如果我理解正確,我將調用「_java_mypackage_EasySign_MethodName」方法,即符號是不同於dll的。因此,使其工作的唯一方法是重寫JNI部分並將其構建爲具有JNI方法的正確符號?
非常感謝您的回覆,感謝您的支持!我編輯了這個問題,試圖讓它更加清晰! – Dan
感謝您的更新!這確實很明顯!如果EasySignJNI提供給您,它們還必須爲您提供包含它們用於構建JNI庫的本機方法聲明的JAR。不幸的是,在編譯庫之後,你不能修改本地方法簽名。所以要回答你的問題;是的,您必須重新編譯JNI部分以更改軟件包名稱。 –