![](/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.