1

目前我正在尝试为 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 代码中遇到这个问题。

4

1 回答 1

0

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

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

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

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

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

于 2012-12-07T21:35:38.880 回答