2
0

ZT_jniarray.cpp 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. //
  2. // Created by Grant Limberg on 10/21/20.
  3. //
  4. #include "ZT_jniarray.h"
  5. #include <vector>
  6. #include <string>
  7. jclass java_util_ArrayList;
  8. jmethodID java_util_ArrayList_;
  9. jmethodID java_util_ArrayList_size;
  10. jmethodID java_util_ArrayList_get;
  11. jmethodID java_util_ArrayList_add;
  12. void InitListJNI(JNIEnv* env) {
  13. java_util_ArrayList = static_cast<jclass>(env->NewGlobalRef(env->FindClass("java/util/ArrayList")));
  14. java_util_ArrayList_ = env->GetMethodID(java_util_ArrayList, "<init>", "(I)V");
  15. java_util_ArrayList_size = env->GetMethodID (java_util_ArrayList, "size", "()I");
  16. java_util_ArrayList_get = env->GetMethodID(java_util_ArrayList, "get", "(I)Ljava/lang/Object;");
  17. java_util_ArrayList_add = env->GetMethodID(java_util_ArrayList, "add", "(Ljava/lang/Object;)Z");
  18. }
  19. jclass ListJNI::getListClass(JNIEnv* env) {
  20. jclass jclazz = env->FindClass("java/util/List");
  21. assert(jclazz != nullptr);
  22. return jclazz;
  23. }
  24. jclass ListJNI::getArrayListClass(JNIEnv* env) {
  25. jclass jclazz = env->FindClass("java/util/ArrayList");
  26. assert(jclazz != nullptr);
  27. return jclazz;
  28. }
  29. jclass ListJNI::getIteratorClass(JNIEnv* env) {
  30. jclass jclazz = env->FindClass("java/util/Iterator");
  31. assert(jclazz != nullptr);
  32. return jclazz;
  33. }
  34. jmethodID ListJNI::getIteratorMethod(JNIEnv* env) {
  35. static jmethodID mid = env->GetMethodID(
  36. getListClass(env), "iterator", "()Ljava/util/Iterator;");
  37. assert(mid != nullptr);
  38. return mid;
  39. }
  40. jmethodID ListJNI::getHasNextMethod(JNIEnv* env) {
  41. static jmethodID mid = env->GetMethodID(
  42. getIteratorClass(env), "hasNext", "()Z");
  43. assert(mid != nullptr);
  44. return mid;
  45. }
  46. jmethodID ListJNI::getNextMethod(JNIEnv* env) {
  47. static jmethodID mid = env->GetMethodID(
  48. getIteratorClass(env), "next", "()Ljava/lang/Object;");
  49. assert(mid != nullptr);
  50. return mid;
  51. }
  52. jmethodID ListJNI::getArrayListConstructorMethodId(JNIEnv* env, jclass jclazz) {
  53. static jmethodID mid = env->GetMethodID(
  54. jclazz, "<init>", "(I)V");
  55. assert(mid != nullptr);
  56. return mid;
  57. }
  58. jmethodID ListJNI::getListAddMethodId(JNIEnv* env) {
  59. static jmethodID mid = env->GetMethodID(
  60. getListClass(env), "add", "(Ljava/lang/Object;)Z");
  61. assert(mid != nullptr);
  62. return mid;
  63. }
  64. jclass ByteJNI::getByteClass(JNIEnv* env) {
  65. jclass jclazz = env->FindClass("java/lang/Byte");
  66. assert(jclazz != nullptr);
  67. return jclazz;
  68. }
  69. jmethodID ByteJNI::getByteValueMethod(JNIEnv* env) {
  70. static jmethodID mid = env->GetMethodID(
  71. getByteClass(env), "byteValue", "()B");
  72. assert(mid != nullptr);
  73. return mid;
  74. }
  75. jobject cppToJava(JNIEnv* env, std::vector<std::string> vector) {
  76. jobject result = env->NewObject(java_util_ArrayList, java_util_ArrayList_, vector.size());
  77. for (std::string s: vector) {
  78. jstring element = env->NewStringUTF(s.c_str());
  79. env->CallBooleanMethod(result, java_util_ArrayList_add, element);
  80. env->DeleteLocalRef(element);
  81. }
  82. return result;
  83. }
  84. std::vector<std::string> javaToCpp(JNIEnv* env, jobject arrayList) {
  85. jint len = env->CallIntMethod(arrayList, java_util_ArrayList_size);
  86. std::vector<std::string> result;
  87. result.reserve(len);
  88. for (jint i=0; i<len; i++) {
  89. jstring element = static_cast<jstring>(env->CallObjectMethod(arrayList, java_util_ArrayList_get, i));
  90. const char* pchars = env->GetStringUTFChars(element, nullptr);
  91. result.emplace_back(pchars);
  92. env->ReleaseStringUTFChars(element, pchars);
  93. env->DeleteLocalRef(element);
  94. }
  95. return result;
  96. }