SoundTouch 和 JNI

Posted

技术标签:

【中文标题】SoundTouch 和 JNI【英文标题】:SoundTouch and JNI 【发布时间】:2013-08-01 17:29:51 【问题描述】:

我想从 java 中调用这个原生方法:void SoundTouch::putSamples(const SAMPLETYPE *samples, uint nSamples)

在我的 Java 代码中,我有这个:public native void putSamples(byte[] samples, int nSamples);

现在我想编写 JNI 部分来桥接这个方法和函数,但是本机函数需要 SAMPLETYPE 类型的参数,但我不知道如何从 jbyteArray“转换”到 @987654325 @。

extern "C" JNIEXPORT void Java_com_example_test_SoundTouch_putSamples(JNIEnv *env, jobject thiz, jbyteArray samples ,jint numSamples)
[Some magic to convert samples to FRAMETYPE I guess...]
st.putSamples(???, numSamples); 

如果使用eclipse搜索,我发现的唯一看似相关的代码在STTypes.cpp中,即:typedef float SAMPLETYPE;

这是否意味着我必须将我的 byte[] 转换为 float[],如果是,如何?

【问题讨论】:

【参考方案1】:

由于 SAMPLETYPE 确实是浮点数,所以应该使用浮点数而不是字节数。

public native void putSamples(float[] samples, int nSamples);

还有……

extern "C" JNIEXPORT void Java_com_example_test_SoundTouch_putSamples(JNIEnv *env, jobject thiz, jfloatArray samples ,jint numSamples)
    float *samplesArray = env->GetFloatArrayElements(samples, 0);
    st.putSamples((SAMPLETYPE *)samplesArray, numSamples); 

【讨论】:

我一直面临使用ndk编译相同功能的问题,请看我的问题***.com/questions/18783644/…

以上是关于SoundTouch 和 JNI的主要内容,如果未能解决你的问题,请参考以下文章

iPhone 的 Soundtouch

iOS SoundTouch 框架 BPM 检测示例

在我的 c 代码中调用 soundtouch 代码,程序崩溃

SoundTouch实现音频变速变调

soundtouch change rate matlab implementation

soundtouch change pitch matlab implementation