2017-02-11 544 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中,編寫一個函數,調用該Java對象的onAudioRecorded方法,並將其傳遞給需要回調的函數。記住你需要在JNI層保存該對象的一個​​實例,並在你最終完成時釋放它。

+0

這是正確的答案。謝謝Gabe! –