[英]Android ndk : Problem for call of Java method from c++ with jni
[英]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是特定于线程的,因线程而异。 不让它们进入音频处理线程是一个很大的禁忌。
最好反过来考虑:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.