从Native java到JNI返回一个字符串数组列表

 2023-01-21    281  

问题描述

ArrayList<String> myArraylist;          

public ArrayList<String> getData(){
    myArraylist = new ArrayList<String>();         
    myArraylist.add("1267982563");
    myArraylist.add("2345678");
    myArraylist.add("5432789");
    return myArraylist;
}

如何从JNI侧中获取上述方法,然后推到向量并从JNI返回JNI中的其他CPP调用.

推荐答案

将arrayList转换为std :: vector :

从Native java到JNI返回一个字符串数组列表

jclass java_util_ArrayList;
jmethodID java_util_ArrayList_;
jmethodID java_util_ArrayList_size;
jmethodID java_util_ArrayList_get;
jmethodID java_util_ArrayList_add;
thread_local JNIEnv *env;

void init() {
  java_util_ArrayList      = static_cast<jclass>(env->NewGlobalRef(env->FindClass("java/util/ArrayList")));
  java_util_ArrayList_     = env->GetMethodID(java_util_ArrayList, "<init>", "(I)V");
  java_util_ArrayList_size = env->GetMethodID (java_util_ArrayList, "size", "()I");
  java_util_ArrayList_get  = env->GetMethodID(java_util_ArrayList, "get", "(I)Ljava/lang/Object;");
  java_util_ArrayList_add  = env->GetMethodID(java_util_ArrayList, "add", "(Ljava/lang/Object;)Z");
}

std::vector<std::string> java2cpp(jobject arrayList) {
  jint len = env->CallIntMethod(arrayList, java_util_ArrayList_size);
  std::vector<std::string> result;
  result.reserve(len);
  for (jint i=0; i<len; i++) {
    jstring element = static_cast<jstring>(env->CallObjectMethod(arrayList, java_util_ArrayList_get, i));
    const char *pchars = env->GetStringUTFChars(element, nullptr);
    result.emplace_back(pchars);
    env->ReleaseStringUTFChars(element, pchars);
    env->DeleteLocalRef(element);
  }
}

将arraylist从jni返回到java

如果您不在JNI中修改此列表,那么最好的策略就是简单地将其全局引用在本机代码中的某个地方.如果您对其进行修改,请保持此 jobject 始终最新(您可能需要方法 java_util_arraylist_add 或/p>

如果您选择从 scratch 向量重建列表,则将解开上述方法:

jobject cpp2java(std::vector<std::string> vector) {
  jobject result = env->NewObject(java_util_ArrayList, java_util_ArrayList_, vector.size());
  for (std::string s: vector) {
    jstring element = env->NewStringUTF(s.c_str());
    env->CallBooleanMethod(result, java_util_ArrayList_add, element);
    env->DeleteLocalRef(element);
  }
  return result;
}

无论如何,与JNI一起工作时,请小心,请始终连接本机线程并在销毁本机线程之前分离.

以上所述是小编给大家介绍的从Native java到JNI返回一个字符串数组列表,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对77isp云服务器技术网的支持!

原文链接:https://77isp.com/post/26265.html

=========================================

https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。