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的主要内容,如果未能解决你的问题,请参考以下文章
在我的 c 代码中调用 soundtouch 代码,程序崩溃