我想學習android ndk。下面是我的Java方法:返回矢量<string>從C++到Java
public static native Vector<String> GetData(String input) ;
'輸入'(輸入參數)將轉到C++本機方法,它將返回一個向量。如何實現方法的C++端?
我想學習android ndk。下面是我的Java方法:返回矢量<string>從C++到Java
public static native Vector<String> GetData(String input) ;
'輸入'(輸入參數)將轉到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)要創建字符串數組,你可以看看Return a String array on a JNI method。
這很容易。謝謝@Doron Yakovlev-Golani – jeff
您應該使用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;
}
什麼字符集和編碼影響你? 'NewStringUTF'預計_modified_ UTF-8。 –