簡體   English   中英

JNI包裝的DLL僅在從默認包中調用時才有效

[英]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.

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