![](/img/trans.png)
[英]java lang class exception -Unable to cast the java vector<user defined java class> return from c++ jni object callback
[英]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.