1

我正在尝试使用 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使用PointerLPCWSTR接口实例化一个对象,使用一个字符串,以便我可以将它传递给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);

我究竟做错了什么?

4

2 回答 2

1

UnsatisfiedLinkError表示您的本机方法Initialize不受 BridJ 约束。

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

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

于 2012-07-22T18:21:35.253 回答
0

我也遇到了这个问题。zOlive 的回应让我走上了正确的道路。我更改了 JNAerator 库选项以匹配我的 DLL 名称(例如-library MyLib MyLib.dll MyLib.h)。那为我修好了。这里有关于库选项的更多信息。

于 2012-07-27T13:22:18.490 回答