JNI_Z_05_方法的操作(没有String类型的参数)
1、步骤:
(1)、获取 jclass
(2)、获取 method的id
(3)、调用 method
ZC: 貌似 JNI里面 操作 类的方法,完全是 无视 访问权限的... 然而 static的方法,稍有不同,要注意。
ZC: CallIntMethod(...) / CallStaticIntMethod(...) 等 函数"Call<Type>Method(jobject obj, jmethodID id, ....);" 中的 <Type>(Int等),值得是 函数的返回值(并非函数的传入参数)。
2、VC6(CPP)的DLL代码:
#include<stdio.h> #include "jniZ_TjniMethod.h" JNIEXPORT void JNICALL Java_jniZ_TjniMethod_NativeFunc(JNIEnv * env, jobject obj) { // 获取obj中对象的class对象 jclass clazz = env->GetObjectClass(obj); // 获取 method的id jmethodID methodId01 = env->GetMethodID(clazz, "Func01", "(I)I"); // public jmethodID methodId02 = env->GetMethodID(clazz, "Func02", "(D)I"); // protected jmethodID methodId03 = env->GetMethodID(clazz, "Func03", "(I)I"); // private jmethodID methodId04 = env->GetStaticMethodID(clazz, "Func04", "(I)I"); // (非public/protected/private)的static int i01 = env->CallIntMethod(obj, methodId01, 1); int i02 = env->CallIntMethod(obj, methodId02, 2.0); // 注意这里,传入 "2.0"和"2" 是由区别的... int i03 = env->CallIntMethod(obj, methodId03, 1); int i04 = env->CallStaticIntMethod(clazz, methodId04, 1); printf("i01 : %d\n", i01); printf("i02 : %d\n", i02); printf("i03 : %d\n", i03); printf("i04 : %d\n", i04); }
3、Java代码:
package jniZ; public class TjniMethod { public int Func01(int _i) { return (100 + _i); } protected int Func02(double _i) { System.out.println("Func02 _i : "+_i); double dRtn = 200 + _i; System.out.println("Func02 dRtn : "+dRtn); int iRtn = (int)dRtn; System.out.println("Func02 iRtn : "+iRtn); return iRtn; } private int Func03(int _i) { return (300 + _i); } static int Func04(int _i) { return (400 + _i); } public native void NativeFunc(); public static void main(String[] args) { //* System.loadLibrary("JniMethod_VC6"); TjniMethod jniZ = new TjniMethod(); jniZ.NativeFunc(); //*/ /* double d = 2; System.out.println("d : "+d); int i = (int)(d + 100); System.out.println("i : "+i); //*/ } }
4、Java控制台输出:
Func02 _i : 2.0
Func02 dRtn : 202.0
Func02 iRtn : 202
i01 : 101
i02 : 202
i03 : 301
i04 : 401
5、