如何将C ++函数指针传递到库的JNI函数

时间:2017-02-11 21:44:41

标签: java android android-ndk java-native-interface

我正在开发一个音频库(AAR),它有助于处理一些信号处理应用程序。在我的库中,我将有一个通用信号处理块(用C ++编写,由JNI分层)。在我处理之后,我的库需要调用一些“回调”函数(由库用户定义),这样用户就可以对处理过的信号做出“自定义”响应。

我希望这是用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

void setLibraryCallback() {
    // HERE IS MY PROBLEM
    // HOW CAN I SET MY LIBRARY’s userCallback to onAudioProcessed
}

void onAudioProcessed(int[] processedAudio) {
    // Do some further processing
    int[] finalAudio = userDefinedProcessing(processedAudio);
    // Make some reactions based on finalAudio
}

1 个答案:

答案 0 :(得分:1)

您需要另一层间接。由于Java中没有函数指针这样的东西,所以不能将其传递给JNI。相反,您必须将它传递给Java对象。建立一个界面

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

将其实例传递给JNI。然后在JNI中,编写一个调用该Java对象的onAudioRecorded方法的函数,并将其传递给需要回调的函数。记住你需要在JNI层保存该对象的实例,并在你最终完成它时释放它。