Я хочу вызвать этот нативный метод из 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);
}
При использовании поиска затмения единственный, казалось бы, релевантный фрагмент кода, который я нашел, был в STTypes.cpp, который: typedef float SAMPLETYPE;
Означает ли это, что я должен преобразовать свой байт [] в число с плавающей точкой [], если да, то как?
Поскольку SAMPLETYPE действительно является float, вы должны использовать float вместо байта.
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);
}
Других решений пока нет …