【问题标题】:How to pass a C++ function pointer into a library's JNI functions如何将 C++ 函数指针传递给库的 JNI 函数
【发布时间】:2017-02-11 21:44:41
【问题描述】:

我正在开发一个有助于处理一些信号处理应用程序的音频库 (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
}

【问题讨论】:

  • 这不是 C,不要垃圾标签!也不是 C++。

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


【解决方案1】:

您需要另一层间接。由于 Java 中没有函数指针之类的东西,所以不能将一个传递给 JNI。相反,您必须向它传递一个 Java 对象。制作接口

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

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

【讨论】:

    猜你喜欢
    • 2012-04-15
    • 1970-01-01
    • 2011-05-19
    • 1970-01-01
    • 2012-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-12
    相关资源
    最近更新 更多