2016-01-06 59 views
0

我想學習android ndk。下面是我的Java方法:返回矢量<string>從C++到Java

public static native Vector<String>  GetData(String input) ; 

'輸入'(輸入參數)將轉到C++本機方法,它將返回一個向量。如何實現方法的C++端?

+0

什麼字符集和編碼影響你? 'NewStringUTF'預計_modified_ UTF-8。 –

回答

1

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

+0

這很容易。謝謝@Doron Yakovlev-Golani – jeff

2

您應該使用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; 
} 
+0

jmethodID構造函數= env-> GetMethodID(clsVec,「」,「()V」);你能解釋一下「()V」是什麼意思? – jeff

+0

感謝@luskan幫助我解決 – jeff

+1

@jeff這是構造函數的簽名,'()'表示零參數,'V'表示返回void。構造函數沒有返回值,但'GetMethodID'需要指定''作爲方法名稱,void'V'作爲返回類型來獲取構造函數。 – marcinj