我正在尝试使用JNI从c++调用java中的两个不同方法。
我的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)发布于 2014-01-10 03:12:35
你想要的不是“"(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。)
https://stackoverflow.com/questions/21028619
复制相似问题