繁体   English   中英

用于运行DLL中声明的方法的代码

[英]Code for running the method declared in DLL

我创建了一个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不包含带有LoadProject方法的IProjectFactory类?

您可以使用JNI或JNA调用本机库中的函数 原始类型被映射。 某些结构也是可能的。 甚至回调函数也是可能的。 请参阅JNA的映射表。

通过设计,这是不可能的:获取为其他运行时环境(例如CLR)设计的类或接口,并在JVM中无缝使用它。

因此,如果您有一个本机过程/函数库,它仅返回指针或原始类型,则可以很好地使用它。

如果您需要使用返回的对象,那么您很不幸。 您需要在它们的本机环境中运行它们,并找到某种进程间通信的方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM