首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用jni:未能找到静态方法id从c++调用java函数

问使用jni:未能找到静态方法id从c++调用java函数
EN

Stack Overflow用户
提问于 2015-02-13 08:45:10
回答 2查看 4K关注 0票数 1

我正在使用android 4.2.2在mac上创建cocos2d-x游戏(v. 4),但我也尝试了其他。我想让NativeHelper类调用c++中的一些本地android内容。我使用本教程作为基础:AdMob它正在工作,但我希望使用带有参数的java函数。出现了错误:

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

以下是java实现:

代码语言:javascript
复制
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++实现:

代码语言:javascript
复制
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):伪方法描述符:(Ljava/lang/String;I;)V 02-13 09:33:16.955: E/JniHelper(28873):未能找到sayHello的静态方法id

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-02-13 09:25:08

你打错了。应该是"(I)V",而不是"(I;)V“

票数 4
EN

Stack Overflow用户

发布于 2016-04-22 03:09:52

您只需打开已编译的.class文件,并搜索方法名称。编译后的文件将是一个十六进制文件,但是方法名称和参数是文本。请参阅示例

代码语言:javascript
复制
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文件更方便。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28495573

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档