Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
libopus create编码器的参数不正确_C_Java Native Interface - Fatal编程技术网

libopus create编码器的参数不正确

libopus create编码器的参数不正确,c,java-native-interface,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/

目前,我正在尝试为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表示应用程序的id(取自opus定义),a总是返回错误代码-1和空指针。我已经尝试将采样率设定为opus_int32,但没有任何改变。我还尝试直接传递已定义的OPUS_应用程序_AUDIO(如果是整数值),但它也没有改变任何内容。不幸的是,我更喜欢Java,所以我希望在我的C代码中能对这个问题有所保留。

我真的很抱歉,但显然我是瞎子(或傻瓜)。我的方法声明全错了

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)

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

我查看了文件
opus_defines.h
。在那里你可以找到
#define OPUS_BAD_ARG-1
。似乎您在调用
opus\u encoder\u create
中给出的参数仍然存在问题。您可以尝试编写一个纯简单的C程序,而不需要复杂的jni,并尝试重现错误。如果是这样,那么库本身就有问题。您还应尝试仅使用一个通道和/或更小的采样率。
opus_int32
jint
相当于
int
。所以这里没有什么可投的。如果您真的使用了问题中描述的参数,我看不出呼叫失败的任何原因。是的,您是对的。C不关心在堆栈上推送多少个参数。顺便说一下,我也没有看到错误的函数签名。也许下一次更好地记录您希望用于调用的参数。