zoukankan      html  css  js  c++  java
  • JNI_Z_07_方法的操作(没有String类型的参数)_参数的传递方式

    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(&parameter[sizeof(long01)], &double01, sizeof(double01));
        memcpy(&parameter[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、

  • 相关阅读:
    RAC RMAN 备份 RMAN03009 ORA19504 ORA27040 RMAN06012 channel c3 not allocated 错误分析
    Oracle 发送邮件 存储过程 代码
    RAC 之 RMAN 备份
    Oracle 一次小优化
    RAC 实例不能启动
    Oracle Hint
    RAC 之 RMAN 备份
    远程客户端 访问 ASM 实例
    RAC RMAN 备份 RMAN03009 ORA19504 ORA27040 RMAN06012 channel c3 not allocated 错误分析
    RAC the cluster database(DB_NAME) already exits
  • 原文地址:https://www.cnblogs.com/javaskill/p/5431501.html
Copyright © 2011-2022 走看看