[英]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.