ZT_jniarray.cpp 3.6 KB

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