2017-02-11 35 views
1

私はいくつかの信号処理アプリケーションの処理に役立つオーディオライブラリ(AAR)を開発しています。私の図書館では、一般的な信号処理ブロック(C++で書かれ、JNIによって階層化されている)を用意します。私の処理後、私のライブラリは、(ライブラリユーザによって定義された)いくつかの "コールバック"関数を呼び出す必要があるため、ユーザは処理されたシグナルに対して "カスタマイズされた"応答を出すことができます。ライブラリのJNI関数にC++関数ポインタを渡す方法

これはC++でインターフェイスされているので、このユーザー定義の "コールバック"機能をiOSライブラリでも使用できます。しかし、私はそれを行う方法がわかりません。続き

はここ----------私の問題

の一例である私のAARライブラリです--------------

JNIで.C

void (*userCallback)(int []); 
void onAudioRecorded(int[] audio) { // this function is called by Java 
    // So some library processing 
    int[] processedAudio = libraryProcessing(audio); 
    // Pass this processed audio to the user-defined function 
    userCallback(audio); 
} 

----------ここではいくつかのユーザーのプロジェクトである私のAARライブラリが含ま--------------ユーザーのアプリの中

user_jni.c

+0

これはCではありません。タグをスパムしないでください!C++でもありません。 – Olaf

答えて

1

間接参照の別のレイヤーが必要です。 Javaには関数ポインタなどはないので、JNIに渡すことはできません。代わりに、Javaオブジェクトに渡す必要があります。インターフェイスを作成する

public interface Callback { 
    void onAudioRecorded(int data[]); 
} 

そのインスタンスをJNIに渡します。次に、JNIで、そのJavaオブジェクトのonAudioRecordedメソッドを呼び出す関数を記述し、コールバックを必要とする関数に渡します。 JNIレイヤーでそのオブジェクトのインスタンスを保持し、最後にそれを終了したら解放する必要があることに注意してください。

+0

正解です。ありがとう、ガベ! –

関連する問題