通过 JNA 在 Borland DLL 中查找函数时出错
Error looking up function in a Borland DLL through JNA
这是我的 DLLService
的 运行 示例:
import com.sun.jna.Native;
import com.sun.jna.win32.StdCallLibrary;
public class DLLService {
public DLLService() throws Exception {
System.out.println("version = " + version() + "\n");
testEvaluate();
}
public void testEvaluate() {
System.out.println(this.loadFile("file", 1));
int[] barre = new int[] {0, 1, 2, 3, 4};
int[] result = new int[]{};
evaluateParty(barre.length, barre, result, 1);
System.out.println(result);
}
public int version() {
return GDLL.INSTANCE.LireNoVersion();
}
public int loadFile(String tslName, int pdwNoSess) {
return GDLL.INSTANCE.ChargerFichier();
}
public interface GDLL extends StdCallLibrary {
GDLL INSTANCE = (GDLL) Native.loadLibrary("tsr32_mini", GDLL.class);
int LireNoVersion();
int ChargerFichier();
}
}
函数 version()
没有问题,但 loadFile(...)
没有问题,我有例外:
Exception in thread "main" java.lang.UnsatisfiedLinkError: Error looking up function 'EvaluerPartie':
在 com.sun.jna.Function.(Function.java:212) 在
com.sun.jna.NativeLibrary.getFunction(NativeLibrary.java:541) 在
com.sun.jna.NativeLibrary.getFunction(NativeLibrary.java:518) 在
com.sun.jna.NativeLibrary.getFunction(NativeLibrary.java:504) 在
com.sun.jna.Library$Handler.invoke(Library.java:220) 在
com.sun.proxy.$Proxy0.EvaluerPartie(来源不明)位于
DLLService.evaluateParty(DLLService.java:29) 在
DLLService.testEvaluate(DLLService.java:16) 在
DLLService.(DLLService.java:9) 在
ProblemsIsolator.main(ProblemsIsolator.java:53)
我已经进行了搜索,但没有找到有效的方法(更改类型、参数、名称...)。下面是函数 l 的原型:DWORD ChargerFichier (LPSTR chNom, DWORD *pdwNoSess)
.
编辑:
同样的错误,即使在使用名称映射器之后也是如此;它仅适用于 LireVersion
:
public void testFunctionMapper() throws Exception {
FunctionMapper mapper = StdCallLibrary.FUNCTION_MAPPER;
NativeLibrary lib = NativeLibrary.getInstance("tsr32_mini");
Method[] methods = {
GDLL.class.getMethod("LireNoVersion",
new Class[] { String.class, int.class }),
GDLL.class.getMethod("ChargerFichier",
new Class[] { String.class, int.class }),
};
for (int i=0;i < methods.length;i++) {
String name = mapper.getFunctionName(lib, methods[i]);
lib.getFunction(name, StdCallLibrary.STDCALL_CONVENTION).getName();
}
}
另外,一位依赖工作者向我展示了很好的方法。
这就是您使用 StdCallFunctionMapper
的方式:
Map options = new HashMap();
options.put(Library.OPTION_FUNCTION_MAPPER, new StdCallFunctionMapper());
MyLib lib = (MyLib)Native.loadLibrary("tsr32_mini", MyLib.class, options);
因为它似乎在 link: How do I get a java JNA call to a DLL to get data returned in parameters? 中起作用,我可以看到你对 ChargerFichier
的定义缺少参数。
也许定义应该是这样的:
int ChargerFichier(PointerByReference chNom, IntByReference pdwNoSess);
也许这个 link 也能帮到你:http://www.viaboxx.de/code/java-interoperation-with-a-native-dll-using-jna/
这是我的 DLLService
的 运行 示例:
import com.sun.jna.Native;
import com.sun.jna.win32.StdCallLibrary;
public class DLLService {
public DLLService() throws Exception {
System.out.println("version = " + version() + "\n");
testEvaluate();
}
public void testEvaluate() {
System.out.println(this.loadFile("file", 1));
int[] barre = new int[] {0, 1, 2, 3, 4};
int[] result = new int[]{};
evaluateParty(barre.length, barre, result, 1);
System.out.println(result);
}
public int version() {
return GDLL.INSTANCE.LireNoVersion();
}
public int loadFile(String tslName, int pdwNoSess) {
return GDLL.INSTANCE.ChargerFichier();
}
public interface GDLL extends StdCallLibrary {
GDLL INSTANCE = (GDLL) Native.loadLibrary("tsr32_mini", GDLL.class);
int LireNoVersion();
int ChargerFichier();
}
}
函数 version()
没有问题,但 loadFile(...)
没有问题,我有例外:
Exception in thread "main" java.lang.UnsatisfiedLinkError: Error looking up function 'EvaluerPartie':
在 com.sun.jna.Function.(Function.java:212) 在 com.sun.jna.NativeLibrary.getFunction(NativeLibrary.java:541) 在 com.sun.jna.NativeLibrary.getFunction(NativeLibrary.java:518) 在 com.sun.jna.NativeLibrary.getFunction(NativeLibrary.java:504) 在 com.sun.jna.Library$Handler.invoke(Library.java:220) 在 com.sun.proxy.$Proxy0.EvaluerPartie(来源不明)位于 DLLService.evaluateParty(DLLService.java:29) 在 DLLService.testEvaluate(DLLService.java:16) 在 DLLService.(DLLService.java:9) 在 ProblemsIsolator.main(ProblemsIsolator.java:53)
我已经进行了搜索,但没有找到有效的方法(更改类型、参数、名称...)。下面是函数 l 的原型:DWORD ChargerFichier (LPSTR chNom, DWORD *pdwNoSess)
.
编辑:
同样的错误,即使在使用名称映射器之后也是如此;它仅适用于 LireVersion
:
public void testFunctionMapper() throws Exception {
FunctionMapper mapper = StdCallLibrary.FUNCTION_MAPPER;
NativeLibrary lib = NativeLibrary.getInstance("tsr32_mini");
Method[] methods = {
GDLL.class.getMethod("LireNoVersion",
new Class[] { String.class, int.class }),
GDLL.class.getMethod("ChargerFichier",
new Class[] { String.class, int.class }),
};
for (int i=0;i < methods.length;i++) {
String name = mapper.getFunctionName(lib, methods[i]);
lib.getFunction(name, StdCallLibrary.STDCALL_CONVENTION).getName();
}
}
另外,一位依赖工作者向我展示了很好的方法。
这就是您使用 StdCallFunctionMapper
的方式:
Map options = new HashMap();
options.put(Library.OPTION_FUNCTION_MAPPER, new StdCallFunctionMapper());
MyLib lib = (MyLib)Native.loadLibrary("tsr32_mini", MyLib.class, options);
因为它似乎在 link: How do I get a java JNA call to a DLL to get data returned in parameters? 中起作用,我可以看到你对 ChargerFichier
的定义缺少参数。
也许定义应该是这样的:
int ChargerFichier(PointerByReference chNom, IntByReference pdwNoSess);
也许这个 link 也能帮到你:http://www.viaboxx.de/code/java-interoperation-with-a-native-dll-using-jna/