我想从Java调用此本地方法:
void SoundTouch::putSamples(const SAMPLETYPE *samples, uint nSamples)

在我的Java代码中,我有以下内容:
public native void putSamples(byte[] samples, int nSamples);

现在,我想编写JNI部分以在该方法和函数之间架起桥梁,但是本机函数需要一个SAMPLETYPE类型的参数,但是我不知道如何从jbyteArray转换为SAMPLETYPE

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 [],如果是的话,如何?

最佳答案

由于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);
}

关于java - SoundTouch和JNI,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18000734/

10-09 06:49