枚举的JNI调用方法引发异常



我的java代码中有以下枚举:

package jni;
public enum Codec2Mode {
CODEC2_MODE_3200(0),
CODEC2_MODE_2400(1),
CODEC2_MODE_1600(2),
CODEC2_MODE_1400(3),
CODEC2_MODE_1300(4),
CODEC2_MODE_1200(5),
CODEC2_MODE_700C(8),
CODEC2_MODE_450(10),
CODEC2_MODE_450PWB(11);
private int m_code;
public int getCode()
{
return m_code;
}
Codec2Mode( int code )
{
m_code = code;
}
}

我需要将它传递给JNI,并使用getCode()返回的值。为此,我声明

public native void initialize(Codec2Mode mode);

这是我试图在C++端访问它的方法:

JNIEXPORT void JNICALL Java_jni_Codec2Wrapper_initialize
(JNIEnv * env, jobject, jobject mode)
{
jclass enumClass = env->FindClass("jni/Codec2Mode");
jmethodID getCodeMethod = env->GetMethodID(enumClass, "getCode", "(V)I");
jint value = env->CallIntMethod(mode, getCodeMethod);
std::cout << "Arg = " << value << std::endl;
}

在java中,我调用codec2.initialize(Codec2Mode.CODEC2_MODE_2400);。但我有分段错误。这里可能有什么问题?

您的签名不正确:

jmethodID getCodeMethod = env->GetMethodID(enumClass, "getCode", "(V)I");

应为:"()I"

这就是它在课堂上的定义。

public int getCode();
descriptor: ()I

你可以得到类似的方法的签名

> javap -cp . -s -p jni.Codec2Mode

最新更新