2016-07-19 11 views
0

私は質問がそれをすべて言うと思います。私はAndroid NDKで作業します。私はstdを含めることはできません、ベクトルの使用をしないでください、単純かつ単純なC + +。私はcppFilePathsfilePathsで最後の文字列のelementCountエントリを含むで終わるでしょう。このコードでJNI jobjectarray(Java String [])を使用してC++ char []を埋める方法は?

 
// filePaths = jobjectarray = Java String[] 
int elementCount = env->GetArrayLength(filePaths); 

// this should end up being the char[] with the filePaths in it 
char *cppFilePaths[elementCount]; 

for (int i = 0; i < elementCount; i++) { 
    jstring jFilePath = (jstring) (env->GetObjectArrayElement(filePaths, i)); 
    const char *cppFilePath = env->GetStringUTFChars(jFilePath, 0); 

    // this does not work! 
    cppFilePaths[i] = cppFilePath; 

    env->ReleaseStringUTFChars(jFilePath, cppFilePath); 
    env->DeleteLocalRef(jFilePath); 
} 

: は、ここで私がこれまで持っているものです。

私は多くを検索し、約strcpyまたはmemcpyを見つけましたが、これまでのところ何も働いていませんでした。

答えて

0

これは今動作します。それは直接GetStringUTFCharsの結果を使用しても大丈夫ですかどうかは、わかりませんが、あなたが割り当てなければならないので、今までのすべてについては何もエラー...

 
const char *cppFilePaths[elementCount] = {}; 

for (int i = 0; i < elementCount; i++) { 
    jstring jFilePath = (jstring) (env->GetObjectArrayElement(filePaths, i)); 
    cppFilePaths[i] = env->GetStringUTFChars(jFilePath, 0); 
    env->DeleteLocalRef(jFilePath); 
} 
+0

は.... ...あなたがリリースを必要とする取得していない、コピー文字列の値を保持したい場合は空きです。また、コピー元のエンコーディングはUTF-8で修正されています。これはネイティブコードで必要とされるものであれば問題ありません。 –

+0

私はループを書き直すように頼むことができるので、 "コピー"部分は機能しますか?私の質問でコードを使用すると、 'jFilePath'はループ全体で同じポインタアドレスを保持していました。これが、最後の文字列が 'cppFilePaths'のすべての要素にあることに終わった理由です – muetzenflo