java - JNI 可以处理任何 dll 文件(Windows)吗?

标签 java dll java-native-interface

我是 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/

相关文章:

java - 使用 getExtra() - NullPointerException

delphi - 在不同的 Delphi 版本之间发送 TStringList

android - 将图像转换为无符号字符*

java - JNI - 为 Windows 打包 64 位和 32 位 DLL

c++ - 错误 C1189 MFC

android - 在Android NDK下,是否可以在不调用Java来检索表面的情况下创建 native 窗口?

java - S3 支持的 java.io.File

java - EJB3为null,在j2se环境中使用时会触发NullPointerException

Java正则表达式预定义字符类?

c# - 在 C# 中使用 COM dll