現在、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 コードでこの問題を解決していただければ幸いです。