我正在使用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。 我基本上没有想法......
答案 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)