使用jni从c ++调用java函数:无法找到静态方法id

时间:2015-02-13 08:45:11

标签: java android c++ java-native-interface cocos2d-x

我正在使用android sdk 4.2.2在mac os上创建cocos2d-x游戏(v.3.4),但我也试过了。我想让NativeHelper类从c ++调用一些原生的android东西。我以本教程为基础:http://www.cocos2d-x.org/wiki/User_Tutorial-Integrate_AdMob 它工作正常,但我想使用带参数的java函数。有错误:

  

02-13 09:33:20.690:W / dalvikvm(28873):Bogus方法描述符:(I;)V   02-13 09:33:20.690:E / JniHelper(28873):无法找到showBanner的静态方法ID

这是java实现:

public static void showBanner(int position) {
        final int _position = position;
        _appActivity.runOnUiThread(new Runnable() {

            @Override
            public void run() {
                if(_appActivity != null){
                    if (!_appActivity.adView.isEnabled()){
                        _appActivity.adView.setEnabled(true);
                    }
                    if (_appActivity.adView.getVisibility() == View.INVISIBLE){
                        _appActivity.adView.setVisibility(View.VISIBLE);
                        RelativeLayout.LayoutParams adParams = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
                        if(_position == 0){
                            adParams.addRule(RelativeLayout.ALIGN_PARENT_TOP);
                        }
                        else{
                            adParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);                           
                        }
                        _appActivity.adView.setLayoutParams(adParams);
                    }
                }
            }
        });
    }

c ++实现:

void NativeHelper::showBanner(int position){
    cocos2d::JniMethodInfo t;
    if (cocos2d::JniHelper::getStaticMethodInfo(t, AppActivityClassName, "showBanner", "(I;)V")){

        t.env->CallStaticVoidMethod(t.classID, t.methodID, position);

        t.env->DeleteLocalRef(t.classID);

        isBannerShowing = true;
    }
}

如果我只是从两个函数中删除位置参数(并将(I;)V改为()V)它就像魅力一样。我尝试了其他参数类型,比如bool,它也不起作用。

我以为我可能做错了所以我找到了这个教程: http://stnguyen.com/cocos2d-x/call-java-functions-from-cpp.html

并且举例说sayHello也不起作用:

  

02-13 09:33:16.955:W / dalvikvm(28873):Bogus方法描述符:   (Ljava / lang / String; I;)V 02-13 09:33:16.955:E / JniHelper(28873):失败   找到sayHello的静态方法id

我正在使用ndk r9,但也尝试了r10。 我基本上没有想法......

3 个答案:

答案 0 :(得分:4)

你输错了。它应该是“(I)V”,而不是“(I;)V”

答案 1 :(得分:4)

您只需打开已编译的.class文件,然后搜索方法名称即可。 编译后的文件将是hex文件,但方法名称和参数是文本。 见Sample

public void InitUserData(int sdk_app_id, String account_type, String 
app_id_3rd, String identifier, String user_sig)

=======>

InitUserDataL(ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V

使用javap也可以,但打开.class文件更方便。

答案 2 :(得分:1)

对我来说,func imageOfCell(frame: CGRect, color:SKColor) -> UIImage { UIGraphicsBeginImageContextWithOptions(frame.size, false, 0) var bezierPath = UIBezierPath(rect: frame) color.setFill() bezierPath.fill() let imageOfCell = UIGraphicsGetImageFromCurrentImageContext()! UIGraphicsEndImageContext() return imageOfCell } 需要double myfunction(java.lang.String astringparam) {}。没有分号的(Ljava / lang / String)D 不起作用。

顺便说一下,我使用" javap -s -classpath bin / classes / org / cocos2dx / javascript / AppActivity"在命令行上获取签名。 (感谢@EJP)

相关问题