我觉得这应该有一个简单的答案,因为我可以使用 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/