繁体   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