繁体   English   中英

Android NDK-引用JNIEnv从C ++调用Java

[英]Android NDK - referencing JNIEnv to call Java from C++

我是C ++的新手,并且在此处使用Superpowered FrequencyDomain示例: https : //github.com/superpoweredSDK/Low-Latency-Android-Audio-iOS-Audio-Engine/blob/master/Examples_Android/FrequencyDomain /app/src/main/jni/FrequencyDomain.cpp

我想用从while循环内部接收到的最大频率不断更新TextView:

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);

但是这些是示例C ++函数中仅有的几行已经可以访问env和thiz的行:

void callJavaMethod(JNIEnv* env,jobject thiz) {...previous 3 lines...}

像这样调用Java函数:

public void updateTextViewFromJNI(int i) {
    txtLoudestFreq.setText(Integer.toString(i));
}

我一直在尝试不同的方法来获取JNIEnv和jobject,但我还没有成功。 我看到它们在这里未使用:

extern "C" JNIEXPORT void Java_com_superpowered_frequencydomain_MainActivity_FrequencyDomain(JNIEnv * __unused javaEnvironment, jobject __unused obj, jint samplerate, jint buffersize)

但我不确定如何通过以下方式访问它们:

audioProcessing

我尝试使它们全球化。 从我已阅读的内容中,我试图获得对它们的引用,但是却缺少如何做的参考。 为了能够调用如下内容,我需要执行哪些步骤:

env->CallVoidMethod(thiz, method, myJavaInt);

从audioProcessing内部? 非常感谢你!

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

Env和thiz是特定于线程的,因线程而异。 不让它们进入音频处理线程是一个很大的禁忌。

最好反过来考虑:

  • 使用您要显示的结果更新音频处理回调中的数组。
  • 创建一个JNI函数以将数组的值返回给Java。
  • 从Runnable(在Java中)定期调用该JNI函数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM