首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将C++函数指针传递到库的JNI函数中

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

Stack Overflow用户
提问于 2017-02-12 05:44:41
回答 1查看 1K关注 0票数 2

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

我希望这是在C++中的接口,这样这个用户定义的“回调”函数也可以在我的iOS库中使用。但我不确定该怎么做。

下面是我的问题的一个例子

-这是我的AAR库

在jni.c中

代码语言:javascript
复制
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中

代码语言:javascript
复制
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
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-12 05:56:16

你需要另外一层间接层。因为Java中没有函数指针这样的东西,所以不能将它传递给JNI。相反,您必须向它传递一个Java对象。制作一个界面

代码语言:javascript
复制
public interface Callback {
   void onAudioRecorded(int data[]);
}

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42181590

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档