[英]JNI wrapped DLL only works when called from the default package
我得到了用於訪問名片掃描儀的DLL和JNI包裝器。
到目前為止,我只能在所有類都在默認包中時調用API。 當我嘗試將類移動到其他包時,出現UnsatisfiedLinkError
。
到目前為止,我還沒有JNI的經驗,想知道是否需要重寫是否可以用其他方式組織項目的包裝器。 我不能做的是使用默認程序包,因為這意味着將我所有的類放在那里。
包裝器看起來像這樣:
public final class Wrapper {
private native int CRTK_Init(int[] lphRTK);
private int m_hRTK;
private int m_hRTKDB;
static
{
System.loadLibrary("crtk_jni");
}
public Wrapper() {
m_hRTKDB = 0;
int[] pRTK = new int[1];
CRTK_Init(pRTK); // UnsatisfiedLinkError here
m_hRTK = pRTK[0];
}
}
JNI的問題在於,包含本機方法的類的標准類名與本機(C-)函數的方法簽名緊密耦合。
C簽名必須類似於
JNIEXPORT jobject JNICALL Java_packageName_className_methodName(JNIEnv * env, jclass parameter)
重命名該類或將其移動到另一個程序包將更改預期的函數名,並導致UnsatisfiedLinkError
。
所以,你可以做什么?
除非您有權訪問本機源來更改函數名,否則所有與DLL捆綁在一起的類都必須保留在默認程序包中,否則所有您自己的類都可以放在您希望擁有它們的位置。
獲取在默認程序包中具有其本機方法的JNI程序包被認為是較差的樣式,並且對於所接收軟件的質量而言並不是一個好兆頭。 並准備比使用默認軟件包AFAIR(例如tomcat)遇到的其他麻煩更大的麻煩。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.