Return 向量<string> 从 C++ 到 Java

Return vector<string> from c++ to Java

我正在努力学习 android ndk。下面是我的 Java 方法:

public static native Vector<String>     GetData(String input) ;

'input'(输入参数)将转到 c++ 本机方法,该方法将 return 一个向量。如何实现该方法的 C++ 端?

1) 使用数组比使用向量更容易:

    public static native String[] getData(String input);

2) 假设您的 Java 包名称是 com.example.jeff 并且您有一个名为 MyCppFacade 的 class 包含 getData()。您需要创建一个包含此函数的 C++ 文件:

    extern "C" jobjectArray Java_com_example_jeff_MyCppFacade_getData(
    JNIEnv* env, jobject obj, jstring input)
    {
         jobjectArray result;
         ...
         return result;
    }

3) 要创建字符串数组,您可以查看 Return a String array on a JNI method

您应该使用 javah 为您的函数生成声明 header。假设方法 GetData 位于 class com.example.hellojni.HelloJni 它将是:

#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_example_hellojni_HelloJni
 * Method:    GetData
 * Signature: (Ljava/lang/String;)Ljava/util/Vector;
 */
JNIEXPORT jobject JNICALL Java_com_example_hellojni_HelloJni_GetData
  (JNIEnv *, jclass, jstring);

#ifdef __cplusplus
}

然后在你的实现文件中(即 test.cpp):

JNIEXPORT jobject JNICALL Java_com_example_hellojni_HelloJni_GetData(JNIEnv *env , jclass, jstring str) {

  // Find Class for Vector
  jclass clsVec = env->FindClass("java/util/Vector");

  // Get its constructor method
  jmethodID constructor = env->GetMethodID(clsVec, "<init>", "()V");

  // Create new Vector object
  jobject objVec = env->NewObject(clsVec, constructor, "");

  // Get addElement method
  jmethodID vecAdd = env->GetMethodID(clsVec, "addElement", "(Ljava/lang/Object;)V");

  // Add new string (created locally)
  jstring retStr = env->NewStringUTF("Whatever");
  env->CallVoidMethod(objVec, vecAdd, retStr);

  // Add string from parameter
  env->CallVoidMethod(objVec, vecAdd, str);

  // Always release local references.
  env->DeleteLocalRef(clsVec);

  return objVec;
}