我有以下方法,它有多个参数点表示法:
static public void configure( Activity activity,String client_options, String app_id, String... zone_ids )
所以现在我想这样称呼它:
jmethodID configMethodID =(*env)->GetStaticMethodID(env, adcolonyclazz, "configure","(Landroid/app/Activity;Ljav/lang/String;Ljava/lang/String;[java/lang/String;)V");
但我得到的只是:
java.lang.NoSuchMethodError:没有名称='configure'签名='(Landroid/app/Activity;Ljava/lang/String;Ljava/lang/String;[java/lang/String;)V'的静态方法
同样适用:
jmethodID configMethodID =(*env)->GetStaticMethodID(env, adcolonyclazz, "configure","(Landroid/app/Activity;Ljav/lang/String;Ljava/lang/String;Ljava/lang/String;)V");
有谁知道这个特定方法的签名变量。谢谢
正确的签名是
javap -s
输出的任何内容。当有工具可以 100% 准确地为您写签名时,不要尝试自己写签名。
接受的答案是正确的,但是,我很难找出 javap 的正确语法。以下是在 Linux 系统上的 Android Studio Giraffe 终端窗口中运行时对我有用的一些命令。从项目的根目录开始。
注意: 提前完整构建您的项目,以便您的
.class
java 输出文件是最新的。 javap
采用 .class
输入,而不是源代码输入。
# Find where javap lives. I didn't have one on my path
find ~ -name javap
# Best javap candidate was found in ~/bin/android-studio/jbr/bin/javap
# Find the .class file for the class that you want to run javap on
find . -iname Foo.class
# .class file found in ./mygreatapp/build/intermediates/javac/debug/classes/com/awesomecompany/mygreatapp/packagename/Foo.class
# cd into the base directory for .class output. Stop at classes. Don't go into com/blahblah
cd ./mygreatapp/build/intermediates/javac/debug/classes
# Now we can run javap. I include -p because I needed private method signatures
~/bin/android-studio/jbr/bin/javap -s -p com/awesomecompany/mygreatapp/packagename/Foo.class
最后一点。我的命令历史记录显示我曾经必须将 android jar 文件作为
bootclasspath
参数传递给 javap。我认为那是因为我想转储系统类而不是我的类之一。该命令如下所示:
~/bin/android-studio/jbr/bin/javap -s -bootclasspath ~/Android/Sdk/platforms/android-31/android.jar android.os.Parcel