zoukankan      html  css  js  c++  java
  • 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
    ", i01);
        printf("i02 : %d
    ", i02);
        printf("i03 : %d
    ", i03);
        printf("i04 : %d
    ", 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、

  • 相关阅读:
    Apache虚拟主机配置
    【笔记】php常用函数
    【笔记】linux x86漏洞利用
    【笔记】ubuntu如何切换到root用户&&linux如何关闭各种保护
    【实验吧】登陆一下好吗???
    渗透相关website
    【实验吧】Reverse400
    ajax+jquery+ashx如何实现上传文件
    使用Jquery解析Json基础知识
    C#中把Datatable转换为Json的5个代码实例
  • 原文地址:https://www.cnblogs.com/javaskill/p/5431088.html
Copyright © 2011-2022 走看看