我需要將C++文件集成到我的Android應用程序項目中。 我可以生成文件並生成.so文件。如何使用函數指針作爲Java的參數調用C++方法(Android)
這是具有函數process()的頭文件。 我需要從我的.java文件調用此方法。
有兩個回調函數會給出結果和正在處理的數據的進度數據。 我無法爲它設計JNI方法。 順便說一句,我從.java文件運行簡單的C++程序。 但是這對我來說相當複雜。 請幫忙!!
進展 - 我創建了一個C++文件,並寫下了包裝
JNIEnv *global;
jobject impl;
struct DataProcessorStruct {
jobject callback_ptr;
DataProcessor *dataProcessor;
};
void dataReadyCallback(std::vector<jint> processedSamples, jint heartRate){
jintArray arr = global->NewIntArray(processedSamples.size());
global->SetIntArrayRegion(arr, 0, processedSamples.size(), (jint *) &processedSamples[0]);
jclass clazz = global->FindClass("com/app/AudioActivity");
jmethodID method = global->GetMethodID(clazz, "dataReady","[Ljava/util/List;I)V");
global->CallVoidMethod(impl,method,arr,heartRate);
__android_log_print(ANDROID_LOG_INFO, "test", "C-dataReadyCallback");
}
void progressCallback(jint progress){
jclass clazz = global->FindClass("com/app/AudioActivity");
jmethodID method = global->GetMethodID(clazz, "dataProcessProgress","(I)V");
global->CallVoidMethod(impl, method,progress);
__android_log_print(ANDROID_LOG_INFO, "test", "C-progressCallback");
}
JNIEXPORT jlong JNICALL Java_com_app_AudioActivity_createDataProcessorObject (JNIEnv * env, jobject obj){
global = env;
impl = obj;
DataProcessorStruct *cpp_obj = new DataProcessorStruct();
if (cpp_obj == NULL) {
return 0;
}
DataProcessor *csObj = new DataProcessor(dataReadyCallback,progressCallback);
if (csObj == NULL) {
return 0;
}
cpp_obj->dataProcessor = csObj;
cpp_obj->callback_ptr = env->NewGlobalRef(obj);
return (jlong)cpp_obj;
}
JNIEXPORT void JNICALL Java_com_app_processData (JNIEnv * env, jobject obj,jlong objId,jint sample,jint dataLeft){
impl = obj;
DataProcessorStruct *cpp_obj = (DataProcessorStruct *)objId;
DataProcessor *dataProcessor=cpp_obj->dataProcessor;
if (dataProcessor != NULL){
dataProcessor->process(sample,dataLeft);
}
}
本機方法是用Java -
public native long createDataProcessorObject();
public native void processData(long dataProcessor,int sample, int dataLeft);
這是這樣做的正確方法? 是否有任何方法我不必直接從dataReadyCallback()和progressCallback()C++方法調用類Java方法,但以某種方式我可以調用Java中的接口方法以從這些C++方法調用,以便任何類監聽這些回調應該得到通知,而不是一個特定的類?
您需要封送Java類型和C++之間的數據。查看[SWIG](http://www.swig.org/)。 –
由於公司政策,我無法使用第三方軟件。 –
如果你的公司禁止你使用工具來讓你的公司很有效率,那麼SWIG是一種產生代碼來編組語言之間的調用的工具。 –