본문 바로가기

6. With IT/6.2 NDK

c에서 java호출(Native to Java)

jni.pdf


JNIExample.pdf



한번 더 포스팅한다. 이 빌어먹을 것 때문에 얼마나 많은 시간을 소비하였는가....ㅡㅡ;;;

<<xxx.c>>
#include <jni.h>

...
JavaVM *g_VM;
JNIEnv *_env;
jclass jNativesCls;
...

JNIEXPORT void JNICALL Java_net_fhtagn_moob_MoobRenderer_nativeResize
  (JNIEnv *env, jobject thiz, jint w, jint h) {
...
 // 1. JNI사용을 위한, VM얻기
env->GetJavaVM(&g_VM);
if( _env == NULL ) {
_env = env;
}
if( g_VM == NULL ) {
_env->GetJavaVM(&g_VM );
}



// 2. Java에서 사용할 method가 선언되어있는 클래스 적어넣기(패키지명 + 클래스명)
if( jNativesCls == NULL ) {
jNativesCls = env->FindClass("net/fhtagn/moob/Moob");  }

// 3. JavaVM pointer를 현재 스레드에 장착(설명 : http://aroundck.tistory.com/569)
g_VM->AttachCurrentThread (&env, NULL);

// 4. 해당 Method의 상세 설정(AIP별 자세한 설정은 jni.pdf를 참고)
jmethodID mid = env->GetStaticMethodID(jNativesCls, 
"OrientationCheck", 
"()I" ); // <- 특히 이놈 설정 주의!!

if (mid == NULL) {
return ;
}

// 5. 해당 함수 사용(AIP별 자세한 설정은 jni.pdf를 참고)
env->CallStaticIntMethod(jNativesCls, mid);


... 
}
 
<<xxxx.java>>
public class Moob extends Activity{
private GLSurfaceView mGLView;
static Configuration mConfig;
static int mode;

static {
System.loadLibrary("moob");
}
 
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mGLView = new MoobGLSurface(this);
mGLView.setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
setContentView(mGLView);
mConfig = getResources().getConfiguration();
    //Force landscape
    //setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
}
    
@Override
protected void onPause() {
super.onPause();
mGLView.onPause();
}

@Override
protected void onResume() {
super.onResume();
mGLView.onResume();
}
// 현제 단말기의 가로, 세로모드 얻어오기
// JNI사용을 위해 무조건적으로 static 사용 권장!!
public static int OrientationCheck() {
// TODO Auto-generated method stub
// Configuration mConfig = getResources().getConfiguration();
if( mConfig.orientation == android.content.res.Configuration.ORIENTATION_LANDSCAPE){
Log.d("Orientation is", " ORIENTATION_LANDSCAPE ");
mode = android.content.res.Configuration.ORIENTATION_LANDSCAPE; // 2
return mode;
}else if( mConfig.orientation == android.content.res.Configuration.ORIENTATION_PORTRAIT){
Log.d("Orientation is", " ORIENTATION_PORTRAIT ");
mode = android.content.res.Configuration.ORIENTATION_PORTRAIT; // 1
return mode;
}
return -1;
}


==================================================================================================================

여기서 가장 중요하다고 생각되는건, java에서 쓸 method가 static으로 선언되어야 된다는 점!!!!!
이것때문에 몇일 개 삽질했음....ㅡㅡ;;; 

'6. With IT > 6.2 NDK' 카테고리의 다른 글

(.data+0x0) multiple definition of 변수 에러  (0) 2012.06.18
정적라이브러리 동적라이브러리  (0) 2012.06.16
NDK-static library빌드 관련...  (0) 2012.03.06
Native to Android  (0) 2012.02.18
android-ndk-r7오류  (0) 2012.02.12