java - 如何通过JNI将java CharSequence转换为c++ char*

标签 java c++ java-native-interface charsequence

我觉得这应该有一个简单的答案,因为我可以使用 java String 轻松完成,但是 CharSequence 出了点问题。我的 java 代码初始化一个 cppGenerator,将一个 functionBlock 对象 传递给它的 generateImplementation 方法,然后返回一个 CharSequence。这是我的代码:

jobject fBlock = env->CallObjectMethod(structuredTextModel, getFunction);
jclass CPPGenerator = lookForClass(env, "Path/CPPGenerator");
jobject CPPGeneratorImpl = invokeClassObj(env, CPPGenerator);
    jmethodID generateImplementation = env->GetMethodID(CPPGenerator, "generateImplementation", "(LPath/FunctionBlock;)Ljava/lang/CharSequence;");
jobject mid = env->CallObjectMethod(CPPGeneratorImpl, generateImplementation, fBlock);
jstring jresult = (jstring)mid;
char* result = (char*)env->GetStringUTFChars(jresult, 0);

当我使用 String 时,这个逻辑对我有用,但是这个函数返回一个 CharSequence。没有类、对象或方法返回 null。程序在 jni.h 尝试调用 GetStringUTFChars 时崩溃。所以我知道我不能将此方法用于 CharSequence。是否只缺少一个 jni 方法,或者我是否必须为 CharSequence 做一些完全不同的事情?

最佳答案

你不能只是将 mid 转换为 jstring 并调用 GetStringUTFChars (因为 mid 可能不是一个String,好像是这样)。对于 CharSequence,没有像 GetStringUTFChars 这样的便捷方法,就像对于 String 一样。

你必须通过调用 charAt 的不方便的方式来完成它:

jclass cCharSequence = env->FindClass("java/lang/CharSequence");
jmethodID mLength = env->GetMethodID(cCharSequence, "length", "()I");
jmethodID mCharAt = env->GetMethodID(cCharSequence, "charAt", "(I)C");

int length = env->CallIntMethod(mid, mLength);
std::string str;
str.reserve(length);
for(int i = 0; i < length; i++) {
    str += env->CallCharMethod(mid, mCharAt, i);
}

// use 'str.c_str()'...

关于java - 如何通过JNI将java CharSequence转换为c++ char*,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44973866/

相关文章:

java - 如何在 Java 中使用 .Net dll

java - 打开、编辑 JTextArea 中的文本并将其保存到 .txt 文件

C++:帕斯卡三角

java - Activiti中的异步流程执行

c++ - 一个变量或对象的内存在程序结束时自动终止,而不是为什么我们使用析构函数?

C++计算两次之间的时间量

android - javah 找不到我的类

android - 在 android 上使用 JNI 进行图像解码和操作

java - 需要一个包含 10 亿个数字的非重复生成列表

java - IntelliJ : Deploying Play 2. 0 应用到 .war 文件;我在 list 中放了什么?