簡體   English   中英

返回向量 <string> 從c ++到Java

[英]Return vector<string> from c++ to Java

我正在嘗試學習android ndk。 以下是我的Java方法:

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

'input'(輸入參數)將轉到c ++本機方法,該方法將返回一個向量。 如何實現方法的c ++端?

您應該使用javah為函數生成聲明標頭。 假設方法GetData位於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;
}

1)使用數組而不是向量會更容易:

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

2)假設您的Java包名稱為com.example.jeff,並且您有一個名為MyCppFacade的類,其中包含getData()。 您需要創建一個包含以下功能的C ++文件:

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

3)要創建您的字符串數組,您可以查看在JNI方法上返回String數組

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM