在 Java-Android 和 JNI 之间发送/接收音频数组

Posted

技术标签:

【中文标题】在 Java-Android 和 JNI 之间发送/接收音频数组【英文标题】:Send/Receive audio arrays between Java-Android and JNI 【发布时间】:2012-07-16 14:34:00 【问题描述】:

我是 android 编程领域的新手,我已经在 Internet 上对 Android 中的 JNI 实现进行了全面搜索。顺便说一句,有很多方法可以做到这一点,我没有找到太多关于 Android 的 C/C++ 中的 DSP 的文档。

我已经从录音(PCM 到浮点)中获取了音频数据,我想将数据发送到 C/C++ 函数来处理这些数据。转换后,我想将数组返回给 Java 活动以播放结果。有没有关于使用 JNI 发送和接收数组的简单示例或文档?

我使用的是 Windows 7、Eclipse 和 Cygwin。

提前谢谢你

【问题讨论】:

这里介绍了 JNI 中的字符串和数组:java.sun.com/developer/onlineTraining/Programming/JDCBook/… 【参考方案1】:

应该很简单,

要将 byteArray 从 Java 传输到 C++,您可以考虑以下示例:

第 1 步:在将调用本机方法的 java 类中声明该方法(在我的示例中是一个简单的 zip)

private native byte[] jniZipString(byte[] unpackedData, int datasize);

步骤 2:在 c++ 中使用 javah.exe 生成头文件和实现 [注意] 从 bin/classes 文件夹中调用 javah(因为您为 android 编码

javah -jni com.example.JavaClassWithNativeMethods

步骤 3:在 C++ 中接收字节数组并转换为 C++ 字节数组

jbyte* tempPointer = env->GetByteArrayElements(jInput, 0);
const char* cinput = (const char*) tempPointer;
int dataSize = (int)env->GetArrayLength(jInput)

第 4 步:处理您的数据

whatever you do to process the bytearray

第五步:将生成的字节数组返回给java

jbyteArray result = (env)->NewByteArray(newDataSize);
(env)->SetByteArrayRegion(result, 0, newDataSize, (jbyte *) processedCharArray); 
return result;

【讨论】:

以上是关于在 Java-Android 和 JNI 之间发送/接收音频数组的主要内容,如果未能解决你的问题,请参考以下文章

Android开发实践:Java层与Jni层的数组传递

在 Java-Android 中设置链接可点击

Java-Android Stuidio(续)

java-Android-常用十大排序算法

java-Android-常用十大排序算法

Java-Android