我正在开发一个音频库(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
}
答案 0 :(得分:1)
您需要另一层间接。由于Java中没有函数指针这样的东西,所以不能将其传递给JNI。相反,您必须将它传递给Java对象。建立一个界面
public interface Callback {
void onAudioRecorded(int data[]);
}
将其实例传递给JNI。然后在JNI中,编写一个调用该Java对象的onAudioRecorded方法的函数,并将其传递给需要回调的函数。记住你需要在JNI层保存该对象的实例,并在你最终完成它时释放它。