c++这边用jni调用java的Cocos2dxActivity里面的函数不成功

c++这边用jni调用java的Cocos2dxActivity里面的函数不成功

C++这边的代码:

JniMethodInfo minfo;//定义Jni函数信息结构体
jobject jobj;
//getStaticMethodInfo 次函数返回一个bool值表示是否找到此函数
bool isHave = JniHelper::getMethodInfo(minfo, “org/cocos2dx/cpp/AppActivity”, “setRate”, “()V”);

if (!isHave) {

}
else{
//调用此函数
minfo.env->CallStaticObjectMethod(minfo.classID, minfo.methodID);
}

java这边的代码:

public void setRate() {
Log.e("", “star”);
try {
Intent localIntent3 = new Intent(“android.intent.action.VIEW”,
Uri.parse(getResources().getString(
R.string.setting_extratext)));
AppActivity.this.startActivity(localIntent3);
} catch (Exception e) {
// TODO: handle exception
}
Log.e("", “end”);
}

我是想实现跳到google play商店的,Log已经打印出 star 和 end 出来了,就是不跳过去google商店,请问是什么原因?

:9:求助啊,顶上去

不是这样调用的吧?具体代码->你还是去看下例子或者搜索下!

平常时很少搜集这些代码,看来得注意收集了!

我记得步骤大概是这样的:

  1. 静态方法的话,直接
    JniMethodInfo minfo;
    bool isHave = JniHelper::getStaticMethodInfo(minfo,
    “package name”,
    “function”,
    “parameter”);
    if(isHave){
    type = minfo.env->CallStaticIntMethod(minfo.classID, minfo.methodID);
    }

  2. 非静态:
    先通过静态方法获取对象,
    根据对象获取函数信息,调用!

     JniMethodInfo minfo;
     bool isHave = JniHelper::getStaticMethodInfo(minfo,
             "package name",
             "getInstance",
             "()Ljava/lang/Object;");
     if(!isHave){
         break;
     }
     jobject jobj = minfo.env->CallStaticObjectMethod(minfo.classID, minfo.methodID);
     if(!jobj){
         break;
     }
     isHave = JniHelper::getMethodInfo(minfo,
             "package name",
             "getIntent",
             "()Landroid/content/Intent;");
     if(!isHave){
         break;
     }
     jobj = minfo.env->CallObjectMethod(jobj, minfo.methodID);
     if(!jobj){
         break;
     }

你好,Log已经打印出 star 和 end 出来了,证明 java这边的setRate() 函数已经调用到了啊,但是就是不执行跳转这个功能啊!

那你应该在catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
把错误信息打印出来,看看是什么错误!

你确定LOG已经出来了? 可是你java端的方法不该是静态的么:13::13::13:

我猜是写错了吧,C++应该是 CallVoidMethod(minfo.classID, minfo.methodID);
你Java的方法是非静态而且是空返回值啊。。。
菜鸟不知道说的对不对。。:7:

Log的确出来了,好像java这边用静态的也不行

C++这边写 CallVoidMethod(minfo.classID, minfo.methodID);好像运行的时候会报错,

好,我试试

如果是调用非静态函数,void型返回值就是CallVoidMethod,int型返回值就是CallIntMethod,float等同理。
如果是调用静态函数,void型返回值就是CallStaticVoidMethod,其他同理。
如果像一楼的示例,确实应该CallVoidMethod啊 :7:

自然会报错 如果调用的非静态方法需要先通过静态方法获取activity的对象

你的setRate方法是写在Cocos2dxActivity里面还是AppActivity里面?

我看你说是调用Cocos2dxActivity里面的函数,可代码里写的是org/cocos2dx/cpp/AppActivity,难道不应该是org/cocos2dx/cpp/Cocos2dxActivity吗?

AppActivity不是继承Cocos2dxActivity么?

已解决问题,c++调用java这边的Activity

C++这边代码
////静态函数示例1.无参数,无返回值---------------------------------$$$$$$-----------------------------
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) //判断当前是否为Android平台
JniMethodInfo minfo;
bool isHave = JniHelper::getStaticMethodInfo(minfo,
“org/cocos2dx/cpp/AppActivity”,
“setRate”,
“()V”);
if(isHave){
minfo.env->CallStaticVoidMethod(minfo.classID, minfo.methodID);
}
#endif

java这边的代码
public class AppActivity extends Cocos2dxActivity {
private static AppActivity _activity;

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    _activity = this;
}

public static void setRate(){
    _activity._setRate();
}

public void _setRate() {
    try {
        Intent localIntent3 = new Intent("android.intent.action.VIEW",
                Uri.parse(getResources().getString(
                        R.string.setting_extratext)));
        AppActivity.this.startActivity(localIntent3);
    } catch (Exception e) {
        // TODO: handle exception
    }
}

}

今天才看到帖子。我也用过这种方法,不过是看网上的。一下就成功了。你的是发帖的代码不对,所以才会导致错误的。多用几次自然会慢慢熟悉也不会出错了。少年加油:2::2::2:

加油,少年。。。