그러니까 사건의 발단은
트래킹할 이미지가 바뀔때마다 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 |