在 c++ 中使用 GetMethodID 两次

Using GetMethodID two times at c++

本文关键字:GetMethodID 两次 c++      更新时间:2023-10-16

我正在尝试使用 JNI 从 c++ 在 java 调用 2 种不同的方法

我的 C++ 代码是:

int main()
{  
    JavaVM *jvm;
    JNIEnv *env;
    JavaVMInitArgs vm_args;
    JavaVMOption options;
    options.optionString="-Djava.class.path=try5.jar";
    vm_args.version=JNI_VERSION_1_6;
    vm_args.nOptions=1;
    vm_args.options=&options;
    vm_args.ignoreUnrecognized=0;
    int ret=JNI_CreateJavaVM(&jvm,(void**)&env,&vm_args);
    jclass cls1=env->FindClass("hilla1");
    jclass cls=reinterpret_cast<jclass>(env->NewGlobalRef(cls1));
    jmethodID constract=env->GetMethodID(cls1,"<init>","()V");
    jobject localobj=env->NewObject(cls,constract);
    jobject instance=env->NewGlobalRef(localobj);
    jclass input = env->FindClass("java/lang/Integer");
    char* str="hilla";
    jstring string1=env->NewStringUTF(str);
    int input2[2]={5,4};
    jintArray args=(jintArray)env->NewIntArray(2);
    int *input1=input2;
    env->SetIntArrayRegion(args,0,2,(jint*)input1);
 jmethodID meth = env->GetStaticMethodID(cls, "main1", "([ILjava/lang/String;)V"); 
 env->CallStaticVoidMethod(cls,meth,args,string1);
 jmethodID meth1= env->GetStaticMethodID(cls,"main2","(I;)[I");

    return 1;}
当我调用main1时,

它可以工作,但是当我调用main2时,它给了我meth1 = 0(GetMethodsID失败)

main2 是:

public static int[] main2(int b)

你想要"(I)[I"不是"(I;)[I"。(分号仅在 L 之后需要。

我相信有一个工具(javap)可以为你生成这些签名;否则它们可能会很烦人。

C:Program FilesJavajdk1.7.0_45>javap -s -classpath myJar.jar com.package.MyClass
    Compiled from "MyClass.java"
   public class com.package.MyClass extends java.lang.Object{
       public com.package.MyClass();
         Signature: ()V
       public void setStuff(com.package.Stuff);
          Signature: (Lcom/package/Stuff;)V
    }

javap非常有用,但要专注于一种方法,请尝试:

javap -s -public java.lang.String | egrep -A 2 "getBytes"

(如果您需要在Windows上egrep,则可以安装GOW。