1

typedef命令からJNAeratorによって生成されたインターフェイスを使用しようとしていますが、それを行う方法が見つかりません。

.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問題は、Stringを使用Pointerしてオブジェクトをインスタンス化し、メソッド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);

私は何が間違っているのですか?

4

2 に答える 2

1

UnsatisfiedLinkErrorは、ネイティブInitializeメソッドが BridJ によってバインドされていなかったことを示します。

このバインドはCPPObjectのコンストラクターによって行われます (それを継承する JNAerated MyClass クラスを取得したと仮定します)。バインドに失敗すると、コンソールにエラー ログが表示されます (いずれにせよ、BRIDJ_VERBOSEを使用してログの詳細度を上げることができます)。 =1環境変数)。

また、適切なライブラリ ( .dll.soまたは.dylib )を見つける場所を知らせる注釈がMyClass必要であるか、そのような注釈を持つクラスの内部クラスである必要があることに注意してください。これは通常、JNAerated クラスの場合ですが、そうでない場合は、NativeLibs4Java の trackerでバグを報告してください。@Library("mylibrary")

于 2012-07-22T18:21:35.253 に答える
0

私もこの問題を抱えていました。zOlive の応答により、正しい道をたどることができました。JNAerator ライブラリ オプションを自分の DLL 名 (例: -library MyLib MyLib.dll MyLib.h) と一致するように変更しました。それは私のためにそれを修正しました。ライブラリ オプションの詳細については、こちらを参照してください。

于 2012-07-27T13:22:18.490 に答える