지칩니다... 도와주세요...몇일 째 똑같은 코드앞에서 처절하게 무릎끓고있네요.... ㅠ 저는 아이폰 개발자인데 자바가 너무 안되서 그러는지... 정말 이유를 모르겠습니다. ㅠㅠ



public class BBCarom_cocos2dx extends Cocos2dxActivity{

private Cocos2dxGLSurfaceView mGLView;


public static Object activity

public static Object cppCall_logsth(){

Log.i("cppCall", "return activity~~~~!!!");

return activity;

}

protected void onCreate(Bundle savedInstanceState){

super.onCreate(savedInstanceState);


setVolumeControlStream(AudioManager.STREAM_MUSIC);

// get the packageName,it's used to set the resource path

String packageName = getApplication().getPackageName();

super.setPackageName(packageName);

setContentView(R.layout.game_demo);

        mGLView = (Cocos2dxGLSurfaceView) findViewById(R.id.game_gl_surfaceview);

        mGLView.setTextField((Cocos2dxEditText)findViewById(R.id.textField));

     

        activity = this;

    }

public void test()

{

Log.i("cppCall", "test~~~~!!!");

}

public void ShowStandardAlert()

    {

Log.i("cppCall", "Alert start~~~~!!!");

   

final AlertDialog.Builder builder=new AlertDialog.Builder(this);

    builder.setTitle("BB 당구 평가하기");

    builder.setMessage("Thanks for playing BB Carom, I want to you guys rate my app ^^ thanks.");

    builder.setIcon(android.R.drawable.ic_dialog_email);

   

    builder.setPositiveButton("BB 당구\n평가하기", new OnClickListener() {

@Override

public void onClick(DialogInterface dialog, int which) {

Intent market = new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=net.daum.android.daum"));

startActivity(market);

}

});

   

    builder.setNegativeButton("취소", new OnClickListener() {

@Override

public void onClick(DialogInterface dialog, int which) {

}

});

   

    builder.setNeutralButton("e-mail\n보내기", new OnClickListener() {

@Override

public void onClick(DialogInterface dialog, int which) {

  Uri uri = Uri.parse("mailto:bbrightdev@gmail.com"); 

            Intent it = new Intent(Intent.ACTION_SENDTO, uri); 

            startActivity(it);

}

});

   

    builder.show();

    }

 ...





JNI 로 cocos2d C++ 코드에서 자바메쏘드를 호출하려는 건데요 
ShowStandardAlert()가 호출하고자 하는 메쏘드입니다... 간단한 "메일보내기", "마켓링크", "취소"하는 버튼얼럿 다이얼로그 하나 띄우는 거구요, 그런데 static 이 아니면 바로 호출이 안되길레.. cppCall_logsth 이녀석을 먼저 호출해서 activity object C++로 보낸다음에 C++ 에서는 그 jobject 를 갖고 일반 public 메쏘드를 호출하는 방식입니다. 문제는.... 위에 보시면 test() 라고 단순히 로그찍는 메쏘드가 있는데 그녀석은 아주 잘 호출이 되는데 똑같은 방식으로 해도 ShowStandardAlert() 는 호출이 되질 않네요... 

이 메쏘드가 호출된 위치가 뭔가 메인쓰레드가 아닌곳이거나 다른 메모리영역이라서 뭔가 참조오류가 일어난 것이 지금 예상해볼수 있는 것 중 하나인데요.. 제가 자바를 처음 해보네요... ㅠ 해결방법을 좀 알려주셨으면 감사하겠습니다..


밑에는 C++ 에서 자바코드 콜하는 소스코드입니다.

xxxxx()
{

JniMethodInfo minfo;

    jobject jobj;


    if(JniHelper::getStaticMethodInfo(minfo, CLASS_OPEN_NAME, "cppCall_logsth", "()Ljava/lang/Object;"))

    {

        jobj = minfo.env->CallStaticObjectMethod(minfo.classID, minfo.methodID);

        if(JniHelper::getMethodInfo(minfo, CLASS_OPEN_NAME, "test", "()V"))

        {

            CCLog("JNI--after obj");


            minfo.env->CallVoidMethod(jobj, minfo.methodID);

        }

    }

...