JNAerator - 使用typedef生成的接口

时间:2012-07-05 10:36:01

标签: java c++ jna jnaerator bridj

我正在尝试使用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$);
        }
    }

问题是,我不知道如何使用LPCWSTRPointer接口使用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

我做错了什么?

1 个答案:

答案 0 :(得分:1)

UnsatisfiedLinkError表示您的原生Initialize方法未受BridJ约束。

这个绑定是由CPPObject的构造函数完成的(我假设你有一个继承自它的JNAerated MyClass类),任何绑定失败都会导致你的控制台出错(无论如何,你可以使用 BRIDJ_VERBOSE = 1 环境变量来增加日志详细程度。

另请注意,您的MyClass应该有一个@Library("mylibrary")注释,以便让它知道在哪里找到合适的库( .dll .so < / em>或 .dylib ),或者应该是具有此类注释的类的内部类。这通常是JNAerated类的情况,但如果不是,请报告NativeLibs4Java's tracker中的错误。