我获得了一个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];
}
}
答案 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有(有?)问题。