目前我正在尝试为 libopus 构建 JNI 绑定。我目前的问题是我有一个像这样的 C 方法:
JNIEXPORT jobject JNICALL
Java_de_akuz_android_libopus_OpusCodecFactory_encodercreate(JNIEnv * env, jint samplingRate, jint channels, jint application)
{
jclass resultClass = (*env)->FindClass(env,"de/akuz/android/libopus/OpusFactoryResult");
jobject result = (*env)->AllocObject(env,resultClass);
jfieldID pointerFieldID = (*env)->GetFieldID(env, resultClass,"pointer","J");
jfieldID errorFieldID = (*env)->GetFieldID(env, resultClass,"errorCode","I");
int error;
OpusEncoder* encoder = opus_encoder_create(samplingRate, channels, application, &error);
char buf[100];
sprintf(buf, "Pointer address: %p", encoder); // puts string into buffer
__android_log_print(ANDROID_LOG_INFO, "OpusNative", buf);
(*env)->SetLongField(env, result, pointerFieldID, encoder);
(*env)->SetIntField(env, result, errorFieldID, error);
return result;
}
当我从 JNI 调用此方法时,采样率值为 48000,通道值为 2,应用程序 id 为 2049(取自 opus 定义),总是得到错误代码 -1 和空指针。我已经尝试将采样率转换为 opus_int32 但它没有改变任何东西。我也尝试直接传递定义的 OPUS_APPLICATION_AUDIO ,而不是它的整数值,但它也没有改变任何东西。不幸的是,我更像是一个 Java 人,所以我将不胜感激在我的 C 代码中遇到这个问题。