繁体   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