我正在尝试使用 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/