我是 JNI 新手。并有几个问题: JNI 可以处理 Windows 中存在的所有类型 dll 吗?我想链接一个库,但它给了我错误。难道JNI和dll不兼容吗?
摘自 VB .NET(有效)
Private Declare Function ConnectReader Lib "rfidhid.dll" () As Integer
Private Declare Function DisconnectReader Lib "rfidhid.dll" () As Integer
Private Declare Function SetAntenna Lib "rfidhid.dll" (ByVal mode As Integer) As Integer
Java 的完整代码
公共(public)类MainForm{
/**
* @param args
*/
public native int ConnectReader();
public static void main(String[] args) {
// TODO Auto-generated method stub
MainForm mf = new MainForm();
System.out.println(mf.ConnectReader());
}
static {
System.loadLibrary("rfidhid");
}
}
显示错误代码
Exception in thread "main" java.lang.UnsatisfiedLinkError: MainForm.ConnectReader()I
at MainForm.ConnectReader(Native Method)
at MainForm.main(MainForm.java:13)
谁能指出我可能做错的地方?
编辑:
事实证明我应该这样做(而且它有效)
import com.sun.jna.Library;
import com.sun.jna.Native;
public class HelloWorld {
public interface MyLibrary extends Library {
public int ConnectReader();
}
public static void main(String[] args) {
Kernel32 lib = (MyLibrary) Native.loadLibrary("rfidhid", MyLibrary.class);
System.out.println(lib.ConnectReader());
}
}
最佳答案
JNI 访问使用损坏的名称;您需要使用正确的名称和参数将系统 API 包装在 JNI stub 中。您不能直接调用系统API。
我建议彻底研究 JNI,或者使用类似 JNA 的东西。以减轻一些苦差事。
例如,给定 Java:
package com.mycompany.jni;
public MyClass
{
native boolean someMethod(String arg)
...
}
链接的 native 方法类似于:
JNIEXPORT jboolean JNICALL Java_com_mycompany_jni_MyClass_someMethod(JNIEnv *jep, jobject thsObj, jstring arg)
关于java - JNI 可以处理任何 dll 文件(Windows)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2642371/