JNI包装的DLL仅在从默认包调用时才有效

时间:2016-07-06 13:19:12

标签: java java-native-interface

我获得了一个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];
    }
}

1 个答案:

答案 0 :(得分:2)

JNI的一点是,包含本机方法的类的完全限定类名与本机(C-)函数的方法签名紧密耦合。

C签名必须类似

<cfquery>
    SELECT COUNT(*)
    FROM Table1
    Where month of date1 is one month less than month of date2 
</cfquery>

重命名该类或将其移动到另一个包会改变预期的函数名称并产生JNIEXPORT jobject JNICALL Java_packageName_className_methodName(JNIEnv * env, jclass parameter)

那你能做什么?

除非您有权访问本地源以更改函数名称,所有与dll一起出现的类必须保留在default-package中,所有您自己的类都可以转到您想要的位置。< / p>

获取在默认包中具有其本机方法的JNI包被认为是不好的样式,并且对于所接收软件的质量而言不是好兆头。并且为使用默认包装AFAIR所带来的进一步麻烦做好准备,例如tomcat有(有?)问题。