안녕하세요 안드로이드 초보 입니다.
jni 관련 질문이 있어서 도움을 청하려고 합니다.
c레벨에서 이미지를 데이타를 리소스로 부터 받기 위해 java에 있는 메소드를 호출할때 에러가 나고 있습니다.
LoadImage()
{
// 타겟 클래스 가지고 온다.
targetClass = env->GetObjectClass(jni_obj);
mID = env->GetMethodID(targetClass, "LoadData","(Ljava/lang/String;)I");
sucess = (jint)(env->CallObjectMethod(jni_obj, mID, jstr));
}
여기서 env->GetMethodID(targetClass, "LoadData","(Ljava/lang/String;)I");를 호출하면
JNI WARNING: expected return type 'L'
calling L com/test/NativeCall: LoadData(L java/lang/String;)I
in L con/test/NativeCall;.touchEnd:(IFF)V (CallObjectMethodV)
라고 뜨며 어플이 종료 되는 현상이 발생하고 있습니다.
------------------------------------------------------------------------------
touchEnd 메소드는 java 단에서
public native void touchBegin(int touchNum, float posX, float posY);
onTouchEvent()
{
case MotionEvent.ACTION_UP:
touchMoved();
break;
}
이런씩으로 선언이 되어 있고
C 레벨에서
JNIEXPORT void JNICALL Java_com_test_NativeCall_touchMoved(JNIEnv* env, jobject obj, jint touchNum,
jfloat tPosX, jfloat tPosY)
{
OnTouchMove();
}
OnTouchMove(); 함수를 통해서 LoadImage() 가 호출되고 있습니다.
간단하게 정리하면 GetMethodID()를 통해서 클래스의 ID를 가져오려고 하면
JNI WARNING: expected return type 'L'
calling L com/test/NativeCall: LoadData(L java/lang/String;)I
in L con/test/NativeCall;.touchEnd:(IFF)V (CallObjectMethodV)
라는 경고가 loacat에 찍히고 어플이 종료 되어 버립니다.
전 com/test/NativeCall: LoadData(L java/lang/String;)I 을 호출했는데
이전 java 레벨에서 호출된
in L con/test/NativeCall;.touchEnd:(IFF)V (CallObjectMethodV) 이런 메시지가 찍히면서
죽는지 알수가 없네요..
이런 현상이 특정 영역에서 지속적으로 발생하고 있네요
혹시 원인이 어떤건지 알 수 있을까요??
리턴 타입은 그냥 int 형인데 입니다.
그리고 일반적인 경우는 잘동작하다 특정 영역에서만 이런 현상이 발생하고 있는데...
조금더 자세히 말씀 해주시면 감사하겠습니다 ^^;
-----------------------------------------------
java에 선언되어 있는 메소드 원형 입니다.
public int LoadData(String filename)
{
int ret = 0;
is = assetManager.open(filename,AssetManager.ACCESS_RANDOM);
img = BitmapFactory.decodeStream(is);
is.close();
// 이미지 사이즈를 2^ 으로 한다.
int width = toPow2((int) imageSize.width);
int height = toPow2((int) imageSize.height);
Bitmap bitmap = Bitmap.createBitmap(width, height,Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
canvas.drawBitmap(img, 0, 0, null);
img.recycle();
img = bitmap;
ret = nativeSetTextureData2(img, img.getWidth(), img.getHeight(),(int)imageSize.width,(int)imageSize.height);
return ret;
}




LoadData 이라는 자바 함수의 리턴타입이 문제인 것 같은데요.