안드로이드에서 NDK로 C++ Class 데이터 유지 및 Class 내 String값
안드로이드에서 C++ 클래스의 포인터주소값을 Java 내에 long 형식으로 할당해두면 가비지 컬렉터에 의해 클래스 데이터가 사라지는걸 방지 할 수
액티비티 자바 파일에서 처리할 부분, long 형식으로 주소값을 받아온다.
public class MainActivity extends AppCompatActivity
{
~
long classptr;
public native long GetClassPtr();
~
@Override
protected void onCreate(Bundle savedInstanceState) {
~
classptr = GetClassPtr();
~
}
~
}
C++ 코드에서 처리할 부분, 클래스를 생성하고 주소값을 return
extern "C"
JNIEXPORT jlong JNICALL
Java_'프로젝트 패키지 이름'_'액티비티 클래스 이름'_GetClassPtr(JNIEnv *env, jobject instance) {
CustomClass* custom = new CustomClass();
custom->Init();
return (long)(custom);
}
long 형식으로 받아온 주소값을 활용하여 String값을 . 아래는 액티비티 클래스 코드
public class MainActivity extends AppCompatActivity
{
~
long classptr;
public native long GetClassPtr();
public native String GetStr_C(long ptr);
String str;
~
@Override
protected void onCreate(Bundle savedInstanceState) {
~
classptr = GetClassPtr();
str = GetStr_C(classptr);
~
}
~
}
C++코드 부분. CustomClass에 String값을 return하는 GetStr함수가 있다고 가정
extern "C"
JNIEXPORT jlong JNICALL
Java_'프로젝트 패키지 이름'_'액티비티 클래스 이름'_GetClassPtr(JNIEnv *env, jobject instance) {
CustomClass* custom = new CustomClass();
custom->Init();
return (long)(custom);
}
extern "C"
JNIEXPORT jstring JNICALL
Java_'프로젝트 패키지 이름'_'액티비티 클래스 이름'_GetStr_C(JNIEnv *env, jobject instance, jlong ptr) {
CustomClass* custom = (CustomClass*)ptr;
String Cstr = custom->GetStr();
return env->NewStringUTF(Cstr.c_str());
}
Written on November 16, 2018