我正在尝试使用JNAerator从typedef指令生成的接口,但我找不到这样做的方法:
.h文件中的函数是:
MyClass::Initialize(LPCWSTR path);
头文件还包含原始的typedef指令:
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$);
}
}
问题是,我不知道如何使用LPCWSTR
和Pointer
接口使用String实例化对象LPCWSTR
,以便我可以将其传递给{ {1}}方法。
我该怎么做?
更新
我修改了.h文件以使用Initialize
:
wchar_t*
JNAerator生成了这样的方法:
MyClass::Initialize(wchar_t* path)
所以我这样称呼它:
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
我做错了什么?
答案 0 :(得分:1)
UnsatisfiedLinkError
表示您的原生Initialize
方法未受BridJ约束。
这个绑定是由CPPObject的构造函数完成的(我假设你有一个继承自它的JNAerated MyClass类),任何绑定失败都会导致你的控制台出错(无论如何,你可以使用 BRIDJ_VERBOSE = 1 环境变量来增加日志详细程度。
另请注意,您的MyClass
应该有一个@Library("mylibrary")
注释,以便让它知道在哪里找到合适的库( .dll , .so < / em>或 .dylib ),或者应该是具有此类注释的类的内部类。这通常是JNAerated类的情况,但如果不是,请报告NativeLibs4Java's tracker中的错误。