我创建了一个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?
答案 0 :(得分:3)
您可以使用JNI或JNA在本机库中调用 functions 。映射原始类型。某些结构也是可能的。甚至可以使用回调函数。请参阅JNA的映射表。
设计中不可能的:获取为不同运行时环境(如CLR)设计的类或接口,并在JVM中无缝使用它。
因此,如果你有一个只返回指针或原始类型的本机过程/函数库,那么你可以很好地使用它。
如果您需要处理返回的对象,那么您运气不好。您需要在其本机环境中运行它们并找到一些进程间通信。