Java JNI包装的DLL仅在从默认包调用时有效
我得到了一个DLL和一个JNI包装器,用于访问名片扫描仪 到目前为止,我只能在所有类都在默认包中时调用API。当我尝试将类移动到其他包时,会出现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);
未满足的链接错误
到目前为止,我还没有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更新了代码片段