Android 返回向量<;字符串>;来自c++;到爪哇

Android 返回向量<;字符串>;来自c++;到爪哇,android,c++,android-ndk,java-native-interface,Android,C++,Android Ndk,Java Native Interface,我正在努力学习android ndk。下面是我的Java方法: public static native Vector<String> GetData(String input) ; 公共静态本机向量GetData(字符串输入); 输入(输入参数)将进入返回向量的C++原生方法。如何实现方法的C++侧? 1)使用数组而不是向量更容易: public static native String[] getData(String input); 2) 假设您的Java

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

public static native Vector<String>     GetData(String input) ;
公共静态本机向量GetData(字符串输入);

输入(输入参数)将进入返回向量的C++原生方法。如何实现方法的C++侧? 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) 要创建字符串数组,可以查看

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) 要创建字符串数组,可以查看

应该使用为函数生成声明头。假设方法
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_示例_hellojni_hellojni_GetData(JNIEnv*env,jclass,jstring str){
//为向量查找类
jclass clsVec=env->FindClass(“java/util/Vector”);
//获取其构造函数方法

jmethodID构造函数=env->GetMethodID(clsVec,“,”()V”); //创建新的矢量对象 jobject objVec=env->NewObject(clsVec,构造函数,“”); //求加法 jmethodidevecadd=env->GetMethodID(clsVec,“addElement”,“Ljava/lang/Object;)V); //添加新字符串(本地创建) jstring retStr=env->NewStringUTF(“任意”); env->CallVoidMethod(objVec、vecAdd、retStr); //从参数添加字符串 env->CallVoidMethod(objVec、vecAdd、str); //始终释放本地引用。 env->DeleteLocalRef(clsVec); 返回objVec; }
您应该使用为函数生成声明头。假设方法
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_示例_hellojni_hellojni_GetData(JNIEnv*env,jclass,jstring str){
//为向量查找类
jclass clsVec=env->FindClass(“java/util/Vector”);
//获取其构造函数方法

jmethodID构造函数=env->GetMethodID(clsVec,“,”()V”); //创建新的矢量对象 jobject objVec=env->NewObject(clsVec,构造函数,“”); //求加法 jmethodidevecadd=env->GetMethodID(clsVec,“addElement”,“Ljava/lang/Object;)V); //添加新字符串(本地创建) jstring retStr=env->NewStringUTF(“任意”); env->CallVoidMethod(objVec、vecAdd、retStr); //从参数添加字符串 env->CallVoidMethod(objVec、vecAdd、str); //始终释放本地引用。 env->DeleteLocalRef(clsVec); 返回objVec; }
jmethodID constructor=env->GetMethodID(clsVec,“,”()V”);你能解释一下“()V”是什么意思吗?谢谢@luskan对我的帮助out@jeff这是构造函数的签名,
()
表示零参数,
V
表示返回void。构造函数没有返回值,但是
GetMethodID
需要指定
作为方法名,并将void
V
作为返回类型来获取构造函数。jmethodID constructor=env->GetMethodID(clsVec,“,”()V”);你能解释一下“()V”是什么意思吗?谢谢@luskan对我的帮助out@jeff这是构造函数的签名,
()
表示零参数,
V
表示返回void。构造函数没有返回值,但是
GetMethodID
需要指定
作为方法名,并将void
V
作为返回类型来获取构造函数。这更简单。谢谢@Doron Yakovlev Golani这更简单。谢谢@Doron Yakovlev Golani字符串的字符集和编码是什么
NewStringUTF
需要修改的UTF-8。字符串的字符集和编码是什么
NewStringUTF
要求修改UTF-8。