我想从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/