我正在尝试使用一个由JNAerator从ty清晰度指令生成的接口,但我找不到这样做的方法:
.h文件中的函数是:
MyClass::Initialize(LPCWSTR path);头文件还包括原始的ty对联f指令:
typedef __nullterminated CONST WCHAR *LPCWSTR, *PCWSTR;JNAerator生成:
方法:
public native int Initialize(LPCWSTR path);接口:
/// Undefined type
/// Undefined type
public static interface LPCWSTR {
};和类:
/// C type : WCHAR*
public Pointer<Short > LPCWSTR() {
try {
return (Pointer<Short >)BridJ.getNativeLibrary("dlls").getSymbolPointer("LPCWSTR").as(DefaultParameterizedType.paramType(Pointer.class, Short.class)).get();
}catch (Throwable $ex$) {
throw new RuntimeException($ex$);
}
}
/// C type : WCHAR*
public MainLibrary LPCWSTR(Pointer<Short > LPCWSTR) {
try {
{
BridJ.getNativeLibrary("dlls").getSymbolPointer("LPCWSTR").as(DefaultParameterizedType.paramType(Pointer.class, Short.class)).set(LPCWSTR);
return this;
}
}catch (Throwable $ex$) {
throw new RuntimeException($ex$);
}
}问题是,我不知道如何使用Pointer和LPCWSTR接口(使用字符串)实例化对象LPCWSTR,以便将其传递给Initialize方法。
我该怎么做?
更新:
我修改了.h文件以使用wchar_t*
MyClass::Initialize(wchar_t* path)JNAerator生成的方法如下:
public native int Initialize(Pointer<Character > path);所以我这样称呼它:
MyClass factory = new MyClass();
Pointer<Character> path = org.bridj.Pointer.pointerToWideCString("dlls");
factory.Initialize(path);问题是,我得到了以下例外:
java.lang.UnsatisfiedLinkError: main.MyClass.Initialize(Lorg/bridj/Pointer;)I在这一行:
factory.Initialize(path);我做错了什么?
发布于 2012-07-22 18:21:35
UnsatisfiedLinkError表示您的本机Initialize方法不受BridJ绑定。
这个绑定是由CPPObject的构造函数完成的(我假设您有一个继承自它的JNAerated MyClass类),任何绑定失败都会导致控制台中的错误日志(在任何情况下,您可以使用BRIDJ_VERBOSE=1环境变量增加日志的冗长性)。
另外,请注意,您的MyClass应该有一个@Library("mylibrary")注释,以便让它知道在哪里找到适当的库(.dll、.so或.dylib),或者应该是具有这种注释的类的内部类。这通常是JNAerated类的情况,但如果不是,请在NativeLibs4Java跟踪器中报告一个bug。
发布于 2012-07-27 13:22:18
我也有这个问题。佐夫的回应让我走上了正确的道路。我更改了JNAerator库选项以匹配我的DLL名称(例如,-library MyLib MyLib.dll MyLib.h)。帮我修好了。还有关于库选项这里的更多信息。
https://stackoverflow.com/questions/11342579
复制相似问题