首页 > 解决方案 > 枚举的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);. 但我得到分段错误。这里有什么问题?

标签: javajava-native-interface

解决方案


您在这里的签名不正确:

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

它应该是:"()I"

这就是它在您的课程中的定义方式。

public int getCode();
    descriptor: ()I

你可以得到这样的方法的签名

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

推荐阅读