libopus创建编码器的错误参数

时间:2012-12-07 07:24:00

标签: c java-native-interface

目前我正在尝试为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,应用程序为2049(取自opus定义),总是得到错误代码-1和空指针。我已经尝试将采样率转换为opus_int32,但它没有改变任何东西。此外,我试图直接传递定义的OPUS_APPLICATION_AUDIO,如果它的整数值,但它也没有改变任何东西。不幸的是,我更像是一个Java人员,所以我很感激我在C代码中对这个问题的所有看法。

1 个答案:

答案 0 :(得分:0)

我真的很抱歉,但显然我是盲人(或愚蠢)。我的方法声明都错了

Java_de_akuz_android_libopus_OpusCodecFactory_encodercreate(JNIEnv * env, jint samplingRate, jint channels, jint application)

我有JNI环境的参数,但没有调用对象的参数。似乎C对Java代码中的本机方法的参数数量或参数的类型不感兴趣。由于在JNIEnv之后丢失了jobject,所有参数都被一次移位,其中samplingRate具有丢失的jobject的指针值。 正确的方法声明是

Java_de_akuz_android_libopus_OpusCodecFactory_encodercreate(JNIEnv * env, jobject object, jint samplingRate, jint channels, jint application)

我希望遇到同样问题的人会发现我的答案很有用。