Код для запуска метода объявлен в DLL - PullRequest
0 голосов
/ 28 января 2012

Я создал код Java, который пытается получить доступ к методу LoadProject класса IProjectFactory, определенного в myAPI.dll. Описание файла DLL гласит: IProjectFactory используется для загрузки файла проекта в память. IProjectFactory является статическим классом в сборке myAPI.dll. Он предоставляет метод LoadProject, который принимает строку, содержащую путь к файлу для загрузки, и возвращает ссылку на результирующий IProject. Используя интерфейс IProject, вы можете различными способами управлять загруженным проектом.

import com.sun.jna.Library;
import com.sun.jna.Native;

public class MyClass {

public interface IProjectFactory extends Library {
    public Object LoadProject(String fileName);
}

public MyClass() {
    //System.loadLibrary("myAPI");
    load();
}

void load() {
    String fileName = "xxx.sp";
    IProjectFactory api = (IProjectFactory) Native.loadLibrary("myAPI",IProjectFactory.class);

    try {
        Object project = api.LoadProject(fileName);
    }
    catch (Exception e) {
        e.printStackTrace();
    }
}

}

После запуска этого кода было сгенерировано следующее сообщение об ошибке:

Exception in thread "AWT-EventQueue-0" java.lang.UnsatisfiedLinkError: Error looking up function 'LoadProject': The specified procedure could not be found.

    at com.sun.jna.Function.<init>(Function.java:179)
    at com.sun.jna.NativeLibrary.getFunction(NativeLibrary.java:350)
    at com.sun.jna.NativeLibrary.getFunction(NativeLibrary.java:330)
    at com.sun.jna.Library$Handler.invoke(Library.java:203)
    at $Proxy0.LoadProject(Unknown Source)

Означает ли это, что myAPI не содержит класс IProjectFactory с методом LoadProject?

1 Ответ

3 голосов
/ 28 января 2012

Вы можете вызывать функции в собственных библиотеках с JNI или JNA. Примитивные типы отображаются. Определенные структуры возможны также. Возможны даже функции обратного вызова. См. Таблицу сопоставления JNA.

Что невозможно по замыслу: получить класс или интерфейс, который был разработан для другой среды выполнения (например, CLR), и использовать его без проблем в JVM.

Так что, если у вас есть собственная процедурная / функциональная библиотека, которая просто возвращает указатели или примитивные типы, вы можете использовать ее довольно хорошо.

Если вам нужно работать с возвращенными объектами, вам не повезло. Вам нужно запустить их в их собственной среде и найти какой-нибудь способ межпроцессного взаимодействия.

...