3

java(android)コードからネイティブc ++メソッドを呼び出し、java関数をパラメーターとして渡すので、関数ポインターをc ++コードに保存し、ネイティブコードからアクティブ化できます。

匿名クラスを使用してJavaで関数ポインターを実装することを選択し、次のようにJavaからネイティブ関数を呼び出します。

interface FunctionPtrHelper {
bool function(String param);

}

NativeFunc(param1,param2,new FunctionPtrHelper() {
public bool myFunction(String param) {
    //body of my function
}});

swig / jniに3番目のパラメーター(実際にはクラス)を認識させ、それをc ++の関数ポインター(「myFunction」を含む)に変換するにはどうすればよいですか?
それが不可能な場合、JavaからC ++に関数ポインタを渡す別の方法はありますか?

4

2 に答える 2

5

C ++インターフェースを記述し、それを「ディレクター」クラスとしてSWIGすることができます。次に、Javaでインターフェースを実装できます。Javaで実装オブジェクトをインスタンス化し、それをインターフェイスへのポインタまたは参照を受け取るC ++メソッドに渡すと、C++はJavaクラスにコールバックできるようになります。例えば:

// SWIGed C++
class IStringToBool
{
public:
    virtual bool call(std::string s) = 0;
}

class IStringToBoolUser
{
public:
    void setFunction(IStringToBool &function);
}

その後:

// Java
public class MyFunction implements IStringToBool {
    public bool call(String s) {
        // do something
        return true;
    }
}

ドキュメント:ディレクターを使用したクロスランゲージポリモーフィズム

于 2012-11-20T15:49:31.243 に答える
1

JNIを使​​用すると、オブジェクトをC ++に渡すことができ、次にC++オブジェクトから関数ポインターを取得できます。

于 2012-11-20T15:36:43.490 に答える