tool_kit.cpp 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. //
  2. // Created by #Suyghur, on 2021/10/15.
  3. //
  4. #include "include/yylog.h"
  5. #include "include/tool_kit.h"
  6. jbyteArray ToolKit::GetJbyteArray(JNIEnv *Env, const char *src) {
  7. return nullptr;
  8. }
  9. jstring ToolKit::GetJString(JNIEnv *env, const char *src) {
  10. jclass clz = env->FindClass("java/lang/String");
  11. jmethodID methodID = env->GetMethodID(clz, "<init>", "([BLjava/lang/String;)V");
  12. jstring encoding = env->NewStringUTF("utf-8");
  13. auto length = static_cast<jsize>(strlen(src));
  14. jbyteArray bytes = env->NewByteArray(length);
  15. env->SetByteArrayRegion(bytes, 0, length, (jbyte *) src);
  16. auto result = (jstring) env->NewObject(clz, methodID, bytes, encoding);
  17. env->DeleteLocalRef(clz);
  18. env->DeleteLocalRef(encoding);
  19. env->DeleteLocalRef(bytes);
  20. return result;
  21. }
  22. std::string ToolKit::JString2String(JNIEnv *env, jstring src) {
  23. if (env == nullptr || src == nullptr) {
  24. LOGE("jstring to string has some error");
  25. return "";
  26. }
  27. char *tmp_ptr = nullptr;
  28. jclass clz = env->FindClass("java/lang/String");
  29. jstring encode_mode = env->NewStringUTF("UTF-8");
  30. jmethodID mid = env->GetMethodID(clz, "getBytes", "(Ljava/lang/String;)[B");
  31. auto byte_array = (jbyteArray) (env->CallObjectMethod(src, mid, encode_mode));
  32. jsize len = env->GetArrayLength(byte_array);
  33. if (len == 0) {
  34. free(tmp_ptr);
  35. return "";
  36. }
  37. jbyte *byte = env->GetByteArrayElements(byte_array, JNI_FALSE);
  38. if (len > 0) {
  39. tmp_ptr = (char *) malloc(len + 1);
  40. memcpy(tmp_ptr, byte, len);
  41. tmp_ptr[len] = 0;
  42. }
  43. env->ReleaseByteArrayElements(byte_array, byte, JNI_FALSE);
  44. std::string result(tmp_ptr);
  45. free(tmp_ptr);
  46. env->DeleteLocalRef(clz);
  47. env->DeleteLocalRef(encode_mode);
  48. env->DeleteLocalRef(byte_array);
  49. return result;
  50. }