// // Created by #Suyghur, on 2021/10/15. // #include "include/yylog.h" #include "include/tool_kit.h" jbyteArray ToolKit::GetJbyteArray(JNIEnv *Env, const char *src) { return nullptr; } jstring ToolKit::GetJString(JNIEnv *env, const char *src) { jclass clz = env->FindClass("java/lang/String"); jmethodID methodID = env->GetMethodID(clz, "", "([BLjava/lang/String;)V"); jstring encoding = env->NewStringUTF("utf-8"); auto length = static_cast(strlen(src)); jbyteArray bytes = env->NewByteArray(length); env->SetByteArrayRegion(bytes, 0, length, (jbyte *) src); auto result = (jstring) env->NewObject(clz, methodID, bytes, encoding); env->DeleteLocalRef(clz); env->DeleteLocalRef(encoding); env->DeleteLocalRef(bytes); return result; } std::string ToolKit::JString2String(JNIEnv *env, jstring src) { if (env == nullptr || src == nullptr) { LOGE("jstring to string has some error"); return ""; } char *tmp_ptr = nullptr; jclass clz = env->FindClass("java/lang/String"); jstring encode_mode = env->NewStringUTF("UTF-8"); jmethodID mid = env->GetMethodID(clz, "getBytes", "(Ljava/lang/String;)[B"); auto byte_array = (jbyteArray) (env->CallObjectMethod(src, mid, encode_mode)); jsize len = env->GetArrayLength(byte_array); if (len == 0) { free(tmp_ptr); return ""; } jbyte *byte = env->GetByteArrayElements(byte_array, JNI_FALSE); if (len > 0) { tmp_ptr = (char *) malloc(len + 1); memcpy(tmp_ptr, byte, len); tmp_ptr[len] = 0; } env->ReleaseByteArrayElements(byte_array, byte, JNI_FALSE); std::string result(tmp_ptr); free(tmp_ptr); env->DeleteLocalRef(clz); env->DeleteLocalRef(encode_mode); env->DeleteLocalRef(byte_array); return result; }