2012-07-05 71 views
1

我试图通过JNAerator从一个typedef指令使用生成的接口,但我不能找到一个方法来做到这一点生成的使用接口:JNAerator typedef中

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方法。

我该怎么做?

UPDATE:

我修改.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); 

我在做什么错?

回答

1

UnsatisfiedLinkError表明你的本地Initialize方法不是由BridJ约束。

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

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

+0

上面的所有行(除了描述我使用类的方式的代码外)都来自JNAerator生成的类。我也检查了@Library注释,并没有问题。我忘了添加这样一个事实,即所提到的异常是在这一行中引发的:factory.Initialize(path); – 2012-07-25 17:12:53

0

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