Android 返回向量<;字符串>;来自c++;到爪哇
我正在努力学习android ndk。下面是我的Java方法: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
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
位于classcom.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
位于classcom.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
需要指定
作为方法名,并将voidV
作为返回类型来获取构造函数。jmethodID constructor=env->GetMethodID(clsVec,“,”()V”);你能解释一下“()V”是什么意思吗?谢谢@luskan对我的帮助out@jeff这是构造函数的签名,()
表示零参数,V
表示返回void。构造函数没有返回值,但是GetMethodID
需要指定
作为方法名,并将voidV
作为返回类型来获取构造函数。这更简单。谢谢@Doron Yakovlev Golani这更简单。谢谢@Doron Yakovlev Golani字符串的字符集和编码是什么NewStringUTF
需要修改的UTF-8。字符串的字符集和编码是什么NewStringUTF
要求修改UTF-8。