그러니까 사건의 발단은

트래킹할 이미지가 바뀔때마다 NDK-Build를 돌리는게 싫었다
 - 트래킹 할 이미지가 바뀔 때마다 이미지 이름이 바뀌기 때문에 경로 수정을 해야하는데 그때마다 수정된 경로로 NDK를 새로 빌드해야했다
그래서 네이티브 메서드에서 string 인자를 받아서 트래킹할 이미지를 바꾸려고했따!

그래서 

자바 :
private native void renderframe();

C++ Native :
JNIEXPORT void JNICALL Java_augmented_AR_Renderer_renderFrame
(JNIEnv*, jobject);

renderframe()의 원래 형태를

자바 : 
private native void renderframe(string str);

C++ Native :
JNIEXPORT void JNICALL Java_augmented_AR_Renderer_renderFrame
(JNIEnv*, jobject, jstring str);

이런 형태로 바꿔서 해보려고했다.


그런데그만!
자바 네이티브메서드는 C++코드로 이루어지는데,
C++에서는 string형태가 없다.
문자열을 출력하기 위해서는 char 형을 사용해야한다.

아무생각없이 char를 이용해서 인자를 받으려고했다.

char mStr = str;

그런데 역시 이런다고 될리가 없었다.
char는 2바이트,, 맞냐? 어쨋든 한글자만 받을 수 있고,
string은 한글지가 넘어가는 형태라 변수형식이 일치하지 않아 에러가 난다.

그래서 네이버형님의 힘을 빌려보았다

JNIEXPORT void JNICALL Java_augmented_AR_Renderer_renderFrame
(JNIEnv* env, jobject, jstring str);

C++ Native :
jboolean isSucceed;
const char *string = (env)->GetStringUTFChars(str, &isSucceed);

C Native :
jboolean isSucceed;
const char *string = (*env)->GetStringUTFChars(env, str, &isSucceed);

여러번의 삽질을 거듭한 결과
이런 형태로 자바의 string 형을 받아낼 수 있었다.
사용할때는 포인터 없이 str로 사용하면 된다.

isSucceed의 역할은 GetStringUTFChars의 기본 형태가
GetStringUTFChars(string, boolean);
이기 때문에, 함수형태를 만족시키려구 따로 만든 변수다.

C++ Native :
(env)->ReleaseStringUTFChars(name, str);
return (env)->NewStringUTF(str);

C Native :
(env)->ReleaseStringUTFChars(env, name, str);
return (env)->NewStringUTF(env, str);

이런형태도 있는데,
함수자체에서 리턴할때는 위의 두 형태로 사용하면 된다.


'Augmented Reality > Moblie AR' 카테고리의 다른 글

Android 개발 시 항상 주의해야 할 점  (0) 2014.06.10
Android LOG  (0) 2014.06.10
Android NDK  (0) 2014.06.10
Android App 구조  (0) 2014.06.10
Qualcomm AR SDK - QCAR  (0) 2014.06.10
Posted by 긍정왕오킹