1。本机代码访问Java代码也可以在被调用的C/C++函数中访问Java程序中的方法。在javah工具生成的C/C++函数声明中,可以看到有两个参数:JNIEXPORTvoidJNICALLJava_com_omg_NativeLib_sayHello(JNIEnv*env,jobjectjobj){cout<<"helloworld"<ArrayGetField/SetFieldGetStaticField/SetStaticFieldCallMethod/CallStaticMethod还有更多什么类型的多功能工作项目?不是静态方法时,传入当前关联的类对象。当传入静态方法时,传入当前类的Class对象。3、Java类型在C/C++Java类型Local中的映射关系类型JNI定义的别名intlongjint/jsizelong__int64jlong??bytesignedcharjbytebooleanunsignedcharjbooleancharunsignedshortjcharshortshortjshortfloatfloatjfloatdoubledoublejdoubleObject_jobject*jobject4。如何获取jclass以便能够在C/C++中使用Java类。在JNI.h头文件中,专门定义了jclass类型,代表Java中的Class类。JNIEnv类中有如下函数获取jclass:jclassFindClass(constchar*clsName);jclassGetObjectClass(jobjectojb);jclassGetSuperClass(jclassobj);Java中也有这些方法JDKFindClass会在classpath环境变量下搜索类。传入完整的类名,注意使用“/”而不是“.”分隔包之间的jclasses。cls_str=env->FindClass("java/lang/String");5.访问Java类属性和方法在C/C++原生代码中访问Java端的代码。一个常见的场景是获取类的属性,调用类的方法。为了在C/C++中表示属性和方法,JNI在jni.h头文件中定义了jfieldID和jmethdID类型,分别表示Java端的属性和方法。获取代表Java属性的jfieldID;那么Java属性操作就可以在本地代码中进行了。同样,当需要调用Java方法时,需要获取到代表该方法的jmethodID,才能调用Java方法。使用JNIEnv的GetFieldID/GetMethodIDGetStaticFieldID/GetStaticMethodID获取对应的jfieldID和jmethodID。看方法定义jfieldIDGetFieldID(jclassclazz,constchar*name,constchar*sig);jmethodIDGetMethodID(jclassclazz,constchar*name,constchar*sig);jfieldIDGetStaticFieldID(jclassclazz,constchar*name,constchar*sig);jmethodIDGetStaticMethodID(jclassclazz,constchar*name,constchar*sig);GetMethodID也可以获得构造函数的jmethodID。创建Java对象时,可以调用指定的构造方法。这个后面会介绍给大家,比如:env->GetMethodID(data_Clazz,"","()V");类似于Java的launch(Reflect),需要指定类和属性/方法名来获取对应的jfieldID或jmethodID。什么是标志?6.什么是标志?例如:TestNative类包com.omg中有两个重载方法;publicclassTestNative{publicvoidfunction(inti){System.out.println("Integer:"+i);}publicvoidfunction(doubled){System.out.println("double:"+d);}}然后在C/C++代码中调用其中一个函数方法;//先获取类jclassclazz_TestNative=env->FindClass("com/omg/TestNative");//获取jmethodID后才能调用jmethodIDid_func=env->GetMethodID(clazz_TestNative,"function",??);但是是voidfunction(inti)方法还是voidfunction(doubled)方法的jmethodID呢?这就是标志的作用,用于指定要获取的属性/方法的类型。如果这里的符号指定为“(I)V”,则获取voidfunction(inti)方法的jmethodID;如果指定为“(D)V”,则获取voidfunction(doubled)方法的jmethodID7.sign签名用于表示要获取的属性/方法的type类型签名booleanZbyteBcharCshortSintIlongLfloatFdoubleDvoidVobjectL+use/to分隔包的完整类名+;Array[+signature例如,[I,[Ljava/lang/String;Method(parameter1typesignatureParameter2typesignature...)returnvaluetypesignature8.signature使用示例获取属性/方法ID(复杂)importjava.util.Date;公共类HelloNative(){公共int属性;publicintfunction(intfoo,Datedate,int[]arr){System.out.println("function");}publicnativevoidtest();}testnativemethod的实现JNIEXPORTvoidJava_Hello_test(JNIEnv*env,jbojectojb){//因为test不是静态函数,所以传入的是调用这个函数的对象jclasshello_clazz=env->GetObjectClass(obj);jfieldIDfiledID_prop=env->GetFieldID(hello_clazz,"property","I");jmethodIDmethodID_func=env->GetMethodID("hello_clazz","function","(ILjava/util/Date;[I)I");env->CallIntMethod(obj,methodID_func,0L,空,空);//invoke}获取的属性是int类型,所以在签名中传入“I”获取函数ID时,最终结果为(ILjava/util/Date;[I)I9。使用javap命令生成签名JDK提供了一个查看某个类的应用的工具,里面可以设置每个方法/属性的输出签名java-s-p[fullCalssName]-s表示输出签名信息-ppass-private,输出成员信息包括私有访问权限