使用 jni 从 C++ 调用 java 函数:找不到静态方法 ID
Calling java function from c++ using jni: Failed to find static method id
我正在使用 android sdk 4.2.2 在 mac os 上创建 cocos2d-x 游戏 (v. 3.4),但我也尝试了其他游戏。我想让 NativeHelper class 从 C++ 调用一些本地 android 东西。我以本教程为基础:http://www.cocos2d-x.org/wiki/User_Tutorial-Integrate_AdMob
它正在工作,但我想使用带参数的 java 函数。出现错误:
02-13 09:33:20.690: W/dalvikvm(28873): Bogus method descriptor: (I;)V
02-13 09:33:20.690: E/JniHelper(28873): Failed to find static method id of showBanner
这里是 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;
}
}
如果我只是从两个函数中删除 position 参数(并将 (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 method descriptor:
(Ljava/lang/String;I;)V 02-13 09:33:16.955: E/JniHelper(28873): Failed
to find static method id of sayHello
我正在使用 ndk r9,但也尝试过 r10。
我基本上没主意了...
你打错了。应该是“(I)V”,而不是“(I;)V”
对我来说 double myfunction(java.lang.String astringparam) {}
需要 (Ljava/lang/String;)D
。 (Ljava/lang/String)D 没有分号不起作用。
顺便说一句,我在命令行上使用 "javap -s -classpath bin/classes/org/cocos2dx/javascript/ AppActivity" 来获取签名。 (感谢@EJP)
直接打开编译好的.class
文件,搜索方法名即可。
编译后的文件是hex文件,但是方法名和参数都是text。
参见 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
文件更方便。
我正在使用 android sdk 4.2.2 在 mac os 上创建 cocos2d-x 游戏 (v. 3.4),但我也尝试了其他游戏。我想让 NativeHelper class 从 C++ 调用一些本地 android 东西。我以本教程为基础:http://www.cocos2d-x.org/wiki/User_Tutorial-Integrate_AdMob 它正在工作,但我想使用带参数的 java 函数。出现错误:
02-13 09:33:20.690: W/dalvikvm(28873): Bogus method descriptor: (I;)V 02-13 09:33:20.690: E/JniHelper(28873): Failed to find static method id of showBanner
这里是 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;
}
}
如果我只是从两个函数中删除 position 参数(并将 (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 method descriptor: (Ljava/lang/String;I;)V 02-13 09:33:16.955: E/JniHelper(28873): Failed to find static method id of sayHello
我正在使用 ndk r9,但也尝试过 r10。 我基本上没主意了...
你打错了。应该是“(I)V”,而不是“(I;)V”
对我来说 double myfunction(java.lang.String astringparam) {}
需要 (Ljava/lang/String;)D
。 (Ljava/lang/String)D 没有分号不起作用。
顺便说一句,我在命令行上使用 "javap -s -classpath bin/classes/org/cocos2dx/javascript/ AppActivity" 来获取签名。 (感谢@EJP)
直接打开编译好的.class
文件,搜索方法名即可。
编译后的文件是hex文件,但是方法名和参数都是text。
参见 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
文件更方便。