Как конвертировать java CharSequence в c ++ char * через JNI

Я чувствую, что это должен быть простой ответ, так как я могу сделать это легко с Java String, но что-то не так с CharSequence, Мой код Java инициализирует cppGeneratorпроходит functionBlock object к его generateImplementation methodи возвращает 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, Никакие классы, объекты или методы не возвращают ноль. Программа вылетает в jni.h пытаясь позвонить GetStringUTFChars, Так что я знаю, что не могу использовать этот метод для CharSequence. Есть только метод jni, который мне не хватает, или я должен сделать что-то совершенно другое для CharSequence?

0

Решение

Вы не можете просто разыграть mid в jstring и позвонить GetStringUTFChars (поскольку mid не может быть Stringчто, похоже, так и есть). Там нет удобного метода, как GetStringUTFChars за CharSequences как есть для Strings.

Вы должны сделать это неудобным способом вызова 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()'...
1

Другие решения

Почему бы не использовать toString напрямую?

jclass clzCharSequence = env->GetObjectClass(mid);
jmethodID toString = env->GetMethodID(clzCharSequence, "toString", "()Ljava/lang/String;");
jobject s = env->CallObjectMethod(mid, toString);
const char* cstr = env->GetStringUTFChars(static_cast<jstring>(s), NULL);
// do something with cstr
env->ReleaseStringUTFChars(static_cast<jstring>(s), cstr);
0