Java enum的JNI调用方法引发异常

Java enum的JNI调用方法引发异常,java,java-native-interface,Java,Java Native Interface,我的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

我的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;
}
JNIEXPORT void JNICALL Java\u jni\u code2wrapper\u初始化
(JNIEnv*env、jobject、jobject模式)
{
jclass enumClass=env->FindClass(“jni/Codec2Mode”);
jmethodID getCodeMethod=env->GetMethodID(enumClass,“getCode”,V)I);
jint value=env->CallIntMethod(模式,getCodeMethod);

std::cout您在此处的签名不正确:

jmethodID getCodeMethod = env->GetMethodID(enumClass, "getCode", "(V)I");
它应该是:
“()I”

它是如何在你的类中定义的

public int getCode();
    descriptor: ()I
你可以像那样得到方法的签名

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

感谢您的帮助!事实上,问题与function prototype description.oOo有关。请享受JNI:).oOo带来的乐趣。