java - 在 C++ 中使用 GetMethodID 两次

标签 java c++ jar jvm java-native-interface

我正在尝试使用 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 Files\Java\jdk1.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 。)

关于java - 在 C++ 中使用 GetMethodID 两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21028619/

相关文章:

java - 如何在java中按整数值的一列对多维字符串数组进行排序?

java - 使用 junit 和 mockito 在 java ee 应用程序中通过 Rest api 调用测试服务

java - @Dependent CDI 注解是否被子类继承?

Java:无法将 JPG 图像作为资源加载到 JAR 文件中

Java 获取与 Jar 相同目录下的文件夹

java - 使用 maven- assembly-plugin 包含所需的驱动程序时找不到合适的驱动程序

java - 分页逻辑怎么写?

c++ - `myLibrary!__scrt_stub_for_is_c_termination_complete+0x12345`是什么符号

c++ - 传入一个函数以获取一个或多个返回值

c++ - 使用 <thread> 在 C++ 中并发线程