java - 枚举的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
推荐阅读
- variables - VHDL 乘法输入和相加结果
- multithreading - Jmeter我如何只能提取一次令牌并将其用于对我的api的do x请求
- linux - Raspberry Pi 脚本:如果损坏,请格式化 USB
- sql-server - 是否可以在不重复的情况下执行我在 IF EXISTS 语句中使用的相同查询?
- python - 用python计算向量中的每个4元素乘积
- python-3.x - 正则表达式 | 提取前面定义的字符串的数字
- migration - 如何将 jira 的 sprint 迁移到 Azure DevOps?
- c# - 使用 httpclient 将 curl 命令转换为 C# 代码
- mongodb - 连接到 AWS 上的 DocumentDB/MongoDB 实例时出现问题
- javascript - 如何获取时刻时区当前配置的时区?