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、

原文地址:https://www.cnblogs.com/javaskill/p/5431088.html