Android NDK——引用JNIENV从C++调用java 我对C++很陌生,我在这里使用超级频率域例子:

Android NDK——引用JNIENV从C++调用java 我对C++很陌生,我在这里使用超级频率域例子: ,java,android,c++,android-ndk,superpowered,Java,Android,C++,Android Ndk,Superpowered,我想持续更新一个TextView,从while循环内部接收的声音最大的频率: static bool audioProcessing(void * __unused clientdata, short int *audioInputOutput, int numberOfSamples, int __unused samplerate) { SuperpoweredShortIntToFloat(audioInputOutput, inputBufferFloat, (unsigned int)

我想持续更新一个TextView,从while循环内部接收的声音最大的频率:

static bool audioProcessing(void * __unused clientdata, short int *audioInputOutput, int numberOfSamples, int __unused samplerate) {
SuperpoweredShortIntToFloat(audioInputOutput, inputBufferFloat, (unsigned int)numberOfSamples); // Converting the 16-bit integer samples to 32-bit floating point.
frequencyDomain->addInput(inputBufferFloat, numberOfSamples); // Input goes to the frequency domain.

// In the frequency domain we are working with 1024 magnitudes and phases for every channel (left, right), if the fft size is 2048.
while (frequencyDomain->timeDomainToFrequencyDomain(magnitudeLeft, magnitudeRight, phaseLeft, phaseRight)) {
我想我需要这样做:

jclass classs = env->FindClass("com/superpowered/frequencydomain/MainActivity");
jmethodID method = env->GetMethodID(classs, "updateTextViewFromJNI","(I)V");
env->CallVoidMethod(thiz, method, myJavaInt);
public void updateTextViewFromJNI(int i) {
    txtLoudestFreq.setText(Integer.toString(i));
}
env->CallVoidMethod(thiz, method, myJavaInt);
<>但是这些是示例C++函数中的唯一行,已经可以访问Env和TIZ:

void callJavaMethod(JNIEnv* env,jobject thiz) {...previous 3 lines...}
像这样调用Java函数:

jclass classs = env->FindClass("com/superpowered/frequencydomain/MainActivity");
jmethodID method = env->GetMethodID(classs, "updateTextViewFromJNI","(I)V");
env->CallVoidMethod(thiz, method, myJavaInt);
public void updateTextViewFromJNI(int i) {
    txtLoudestFreq.setText(Integer.toString(i));
}
env->CallVoidMethod(thiz, method, myJavaInt);
我一直在尝试不同的方法来获得JNIEnv和jobject,但我还没有成功。我发现它们在这里没用过:

extern "C" JNIEXPORT void Java_com_superpowered_frequencydomain_MainActivity_FrequencyDomain(JNIEnv * __unused javaEnvironment, jobject __unused obj, jint samplerate, jint buffersize)
但我不确定如何在以下位置访问它们:

audioProcessing
我试着让它们全球化。从我所读到的,我试图得到一个参考他们,但错过了如何做到这一点。我需要执行哪些步骤才能调用类似的内容:

jclass classs = env->FindClass("com/superpowered/frequencydomain/MainActivity");
jmethodID method = env->GetMethodID(classs, "updateTextViewFromJNI","(I)V");
env->CallVoidMethod(thiz, method, myJavaInt);
public void updateTextViewFromJNI(int i) {
    txtLoudestFreq.setText(Integer.toString(i));
}
env->CallVoidMethod(thiz, method, myJavaInt);

从内部音频处理?多谢各位

不建议从音频处理线程调用Java,因为它涉及多个阻塞调用

Env和thiz是特定于线程的,不同于不同的线程。为音频处理线程获取它们是一个大问题

最好换个角度考虑:

使用您想要的结果更新音频处理回调中的数组 展示。 创建一个JNI函数,将数组的值返回给Java。 定期从Java中的可运行程序调用该JNI函数。
谢谢你,加博,我脑子里想的是推送数据,但现在我却在拉它。我在这里使用了克里斯·康威的答案:让它按照我想要的方式工作。再次感谢!