【问题标题】:Can JNI handle any dll files (Windows)?JNI 可以处理任何 dll 文件(Windows)吗?
【发布时间】:2010-04-15 02:26:52
【问题描述】:

我是 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 的完整代码

公共类 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());
    }
 }

【问题讨论】:

    标签: java dll java-native-interface


    【解决方案1】:

    JNI 访问使用错位名称;您需要使用正确的名称和参数将系统 API 包装在 JNI 存根中。不能直接调用系统 API。

    我建议彻底研究 JNI,或者使用 JNA 之类的东西来减轻一些繁重的工作。

    例如,给定 Java:

    package com.mycompany.jni;
    
    public MyClass
    {
    native boolean someMethod(String arg)
    ...
    }
    

    链接的本机方法类似于:

    JNIEXPORT jboolean JNICALL Java_com_mycompany_jni_MyClass_someMethod(JNIEnv *jep, jobject thsObj, jstring arg)               
    

    【讨论】:

    • 你刚刚节省了一整天(研究方向错误)
    • 很高兴我能帮上忙。我仍然记得多年前在 JNI 上剥皮是什么感觉。
    猜你喜欢
    • 2014-09-05
    • 1970-01-01
    • 1970-01-01
    • 2012-02-06
    • 1970-01-01
    • 2010-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多