2017-02-11 10 views
1

Я разрабатываю аудио-библиотеку (AAR), которая помогает обрабатывать некоторые приложения для обработки сигналов. В моей библиотеке у меня будет общий блок обработки сигналов (написанный на C++ и многоуровневый JNI). После моей обработки моей библиотеке необходимо вызвать некоторые функции «обратного вызова» (определенные пользователями библиотеки), поэтому пользователи могут настраивать свои «настраиваемые» ответы на обработанные сигналы.Как передать указатель функции 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

Это не C, не спам-теги !, а не C++. – Olaf

ответ

1

Вам нужен еще один слой косвенности. Поскольку в Java нет таких функций, как указатель на функцию, вы не можете передать его JNI. Вместо этого вы должны передать ему объект Java. Сделать интерфейс

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

Передайте экземпляр этого сообщения JNI. Затем в JNI напишите функцию, вызывающую метод onAudioRecorded этого объекта Java, и передайте ее функции, которая требует обратного вызова. помните, что вам нужно удерживать экземпляр этого объекта на уровне JNI и освобождать его, когда вы, наконец, закончите с ним.

+0

Это правильный ответ. Спасибо, Гейб! –