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;
}

サンプルレートに48000、チャネルに2、アプリケーションのIDとして2049(opus定義から取得)の値を使用してJNIからこのメソッドを呼び出すと、常にエラーコード-1とnullポインターが返されます。サンプルレートを opus_int32 にキャストしようとしましたが、何も変わりませんでした。また、整数値の場合は代わりに定義された OPUS_APPLICATION_AUDIO を直接渡そうとしましたが、何も変更しませんでした。残念ながら、私はどちらかというと Java 派なので、私の C コードでこの問題を解決していただければ幸いです。

4

1 に答える 1

0

I'm really sorry, but obviously I'm blind (or stupid). My method declaration is all wrong

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

I have the parameter for the JNI environment but not the parameter for the calling object. It seems that C isn't interested in the amount of arguments of the native method in the Java code or the type of the arguments. Because of the missing jobject after JNIEnv all my parameters were shifted by one with samplingRate having the value of the pointer for the missing jobject. The correct method declaration would be

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

I hope that anyone running into the same problem will find my answer useful.

于 2012-12-07T21:35:38.880 に答える