1、
2、VC6(CPP)的DLL代码:
#include<stdio.h> #include "jniZ_TjniMethod02.h" JNIEXPORT void JNICALL Java_jniZ_TjniMethod02_NativeFunc(JNIEnv * env, jobject obj) { jclass clazz = env->GetObjectClass(obj); jmethodID methodId01 = env->GetMethodID(clazz, "Func", "(JD)V"); // jlong 对应的本地类型是 __int64,如果下面直接传值2的话 变量的长度就不对了 env->CallVoidMethod(obj, methodId01, (jlong)2, 3.3); // *** // 1、第一种参数传递方式 jmethodID methodId02 = env->GetMethodID(clazz, "Func", "(JDC)V"); env->CallVoidMethod(obj, methodId02, (jlong)1, 3.3, L'Z'); // 2、第二种参数传递方式 int iLen = sizeof(jlong) + sizeof(jdouble) + sizeof(jchar); jlong long01 = 1; jdouble double01 = 3.3; jchar char01 = L'Z'; va_list parameter = new char[iLen]; memcpy(parameter, &long01, sizeof(long01)); memcpy(¶meter[sizeof(long01)], &double01, sizeof(double01)); memcpy(¶meter[sizeof(long01)+sizeof(double01)], &char01, sizeof(char01)); env->CallVoidMethodV(obj, methodId02, parameter); // ZC: 注意这里有一个字母"V" delete[] parameter; // 释放堆内存 // 3、第三种参数传递方式 jvalue* args = new jvalue[3]; args[0].j = (jlong)1; args[1].d = 3.3; args[2].c = L'Z'; env->CallVoidMethodA(obj, methodId02, args); // ZC: 注意这里有一个字母"A" delete[] args; // 释放指针堆内存 }
3、Java代码:
package jniZ; public class TjniMethod02 { public void Func(long _long, double _d) { System.out.println("_long : "+_long); System.out.println("_d : "+_d); System.out.println(); } public void Func(long _long, double _d, char _c) { System.out.println("_long : "+_long); System.out.println("_d : "+_d); System.out.println("_c : "+_c); System.out.println(); } public native void NativeFunc(); public static void main(String[] args) { System.loadLibrary("JniMethod02_VC6"); TjniMethod02 jniZ = new TjniMethod02(); jniZ.NativeFunc(); } }
4、Java控制台输出:
_long : 2
_d : 3.3
_long : 1
_d : 3.3
_c : Z
_long : 1
_d : 3.3
_c : Z
_long : 1
_d : 3.3
_c : Z
5、