2013-10-25 1 views
3

안녕하세요, JNI를 사용하여 Java 문자열 배열을 C++ 배열에 복사하려고합니다. 나는 이것을 시도했지만 작동하지 않는 것 같습니다.Java에서 C++로 문자열 배열 가져 오기 JNI

char *myarray; 

JNIEXPORT void JNICALL 
Java_com_Example_accessArray(JNIEnv *env, jobject obj, jobjectArray stringArrays){ 
     int size; 
     size = env->GetArrayLength(stringArrays); 
    myarray = env->GetCharArrayRegion(stringArrays, 0, size, null); 

} 

myarray는 전달 된 Java 배열에서 동일한 값을 유지합니까? 또는 JNI를 통해 전달 된 java String 배열의 값을 C++ 배열에 복사하여 C++의 배열에 같은 vale 값을 저장할 수 있습니까? 미리 감사드립니다.

+0

어떤 문자셋/인코딩 ("코드 페이지") 문자열을 넣으시겠습니까? 유니 코드/UTF-16, 유니 코드/UTF-8, Windows-1252 (그러나 아마도 수정되지 않은 UTF-8_)일까요? Java 문자열은 유니 코드이므로 다른 문자 집합으로 변환하려면 대상 문자 집합에 문자가없는 경우 수행 할 작업은 무엇입니까? '?'를 사용하십시오. 또는 다른 대용품, 예외를 던져, ...? –

답변

6

이 배열에서 문자를 가져올 수 없도록 객체 배열을 전달합니다. 방법이 다음과 같이 될 것이다 : 이것은 내가에 자바 문자열 배열 String[]을 변환하는 데 사용하는 코드는

int size = env->GetArrayLength(stringArrays); 

for (int i=0; i < size; ++i) 
{ 
    jstring string = env->GetObjectArrayElement(stringArrays, i); 
    const char* mayarray = env->GetStringUTFChars(string, 0); 
    .... do some work or copy it to a c++ array of char*.... 
    env->ReleaseStringUTFChars(string, myarray); 
    env->DeleteLocalRef(string); 
} 
+0

좋은 답변이지만 루프 끝 부분에서'DeleteLocalRef (string)'을 호출하여 무제한의 객체 참조를 만들지 않도록해야합니다. 또한 'ReleaseStringUTFChars (string, myarray)'여야합니다. – pburka

+0

@pburka : 당신은 둘 다 맞습니다. 배열의 요소 수가 적 으면 차이는별로 없지만 나는 상처를주지는 않습니다. 그리고 ReleaseString 호출을 잘 잡아라. 보통 나는 jni를 사용할 때 c를 사용하고 마지막 매개 변수는 iscopy입니다. – mkaes

1

는 C++ vector<string> :

void Java_com_domain_project_activity_stringArrToStringVector(JNIEnv *env, jobject obj, jobjectArray jstringArr) { 
     vector<string> stringVec; 

     // Get length 
     int len = env->GetArrayLength(jstringArr); 

     for (int i=0; i<len; i++) { 
      // Cast array element to string 
      jstring jstr = (jstring) (env->GetObjectArrayElement(jstringArr, i)); 

      // Convert Java string to std::string 
      const jsize strLen = env->GetStringUTFLength(jstr); 
      const char *charBuffer = env->GetStringUTFChars(jstr, (jboolean *) 0); 
      string str(charBuffer, strLen); 

      // Push back string to vector 
      stringVec.push_back(str); 

      // Release memory 
      env->ReleaseStringUTFChars(jstr, charBuffer); 
      env->DeleteLocalRef(jstr); 
     } 
} 

그리고 함수가 보일 것 자바 측

다음과 같이하십시오 :

void stringArrToStringVector(String[] jstringArr); 

그리고 마지막으로, 보조 노트로 자바 문자열 목록을 문자열 배열로 변환하십시오. 당신의 JNI 함수에), 당신은 다음을 할 수 있습니다 :

List<String> strList = new ArrayList<>(); 
// Populate strList 
String[] strArr = new String[strList.size()]; 
strList.toArray(strArr);