본문 바로가기

Game Programming

오랜만에 jni 관련 수정.

오랜만에 루팅크라운 클라이언트를 실행하다보니 art 시스템에서 오류가 나오는 문제가 생겼다.


신기하게도 안드로이드 업데이트 이전에는 괜찮았는데 업데이트 이후에 이런 문제가 발생한다.


1. is missing DT_SONAME will use basename as a replacement:

- 이건 그냥 경고 정도로 보면 된다.


2. JNI DETECTED ERROR IN APPLICATION: jclass is an invalid local reference

- 이건 골치아픈 문제이다. 대부분의 경우 2가지로 나뉘어지는데 multidex 처리가 아니라면 구형 sdk를 사용하다가 런타임이 art로 변경되면서

생기는 문제일 것이다.


대표적인 경우가 LocalRef 처리에서 엄격함을 무시했기 때문으로 볼 수 있는데, localref취득 후 릴리즈를 해주어도 이전에는 함수 안에서는 사용에 문제가 없었다. count 자체가 dalvik과 art가 바뀌어서라기 보다는 엄격함이 추가되었기에 이런 경우가 생긴다.


jclass class_activity = g_env->GetObjectClass(activity->clazz);


이런식으로 jclass 취득 후, CallStaticObjectMethod를 사용한다면 이전에는


CallStaticObjectMethod 앞에 DeleteLocalRef(class_activity)를 해두어도 문제가 없지만 art에서는 확실하게 바로 날리기 때문에 문제가 발생한다.


물론 이렇게 하는 사람이 몇이나 될까하지만 예전에 짜둔 코드를 되집어 실행하다보면 왜 안될까? 어처구니 없는 과거의 실수와 마주치게 된다.


ㅎㅎ;