Может ли JNI обрабатывать какие-либо DLL-файлы (Windows)? - PullRequest
2 голосов
/ 15 апреля 2010

Я новичок в JNI. И есть несколько вопросов: Может JNI обрабатывать каждый тип DLL существует в Windows? Я хотел связать библиотеку, но это дает мне ошибку. Возможно ли, что 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)

Может кто-нибудь указать мне, где я могу поступить неправильно?

EDIT:

Оказывается, я должен делать это (и это работает)

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

1 Ответ

3 голосов
/ 15 апреля 2010

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)               
...