• 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、

  • 相关阅读:
    IE6-9中tbody的innerHTML不能赋值bug
    matchesSelector及低版本IE中对该方法的实现
    JavaScript日期组件的实现
    IE6/7/8中parseInt第一个参数为非法八进制字符串且第二个参数不传时返回值为0
    子程序设计原则
    仅IE6中链接A的href为javascript协议时不能在当前页面跳转
    JavaScript获取图片的原始尺寸
    JavaScript判断图片是否加载完成的三种方式
    Mac OS X 快捷键
    IE6-8中Date不支持toISOString方法
  • 原文地址:https://www.cnblogs.com/javaskill/p/5431088.html
Copyright © 2020-2023  润新知