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;
}
我正在努力学习 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;
}