我正在开发一个音频库(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
}发布于 2017-02-12 05:56:16
你需要另外一层间接层。因为Java中没有函数指针这样的东西,所以不能将它传递给JNI。相反,您必须向它传递一个Java对象。制作一个界面
public interface Callback {
void onAudioRecorded(int data[]);
}将其实例传递给JNI。然后,在JNI中,编写一个调用该Java对象的onAudioRecorded方法的函数,并将其传递给需要回调的函数。请记住,您需要在JNI层保留该对象的一个实例,并在最终使用完它时释放它。
https://stackoverflow.com/questions/42181590
复制相似问题