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

Java JNI包装的DLL仅在从默认包调用时有效,java,java-native-interface,Java,Java Native Interface,我得到了一个DLL和一个JNI包装器,用于访问名片扫描仪 到目前为止,我只能在所有类都在默认包中时调用API。当我尝试将类移动到其他包时,会出现未满足的链接错误 到目前为止,我还没有JNI的经验,我想知道如果我能以一种不同的方式组织这个项目,我是否需要重写它的包装。我不能做的是使用默认包,因为这意味着将我的所有类都放在那里 包装器如下所示: public final class Wrapper { private native int CRTK_Init(int[] lphRTK);

我得到了一个DLL和一个JNI包装器,用于访问名片扫描仪

到目前为止,我只能在所有类都在默认包中时调用API。当我尝试将类移动到其他包时,会出现
未满足的链接错误

到目前为止,我还没有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)
重命名该类或将其移动到另一个包将更改预期的函数名,并导致
未满足的链接错误

那你能做什么呢

除非您有权访问本机源以更改函数名,否则与dll捆绑在一起的所有类都必须保留在默认包中,您自己的所有类都可以放在您想要的地方


获取一个在默认包中包含其本机方法的JNI包被认为是糟糕的风格,并且对所接收软件的质量不是好兆头。并做好准备,以应对使用默认软件包可能带来的更多麻烦,例如tomcat在这些方面有(有?)问题

我想我们需要一些源代码。直觉:您的JNI包装器有问题。@jornverne更新了代码片段