zoukankan      html  css  js  c++  java
  • JNI_Z_08_创建Java对象

    1、步骤 :

      (1)、获取 jclass

      (2)、获取 构造函数的 method id  (方法的名称始终为"<init>")

      (3)、创建Java对象的两种方式:

        (3.1)、jobject obj?? = (JNIEnv *)->NewObject(jclass _clazz, 构造函数的MethodId, 构造函数的参数); // ZC: 可变参数函数,"构造函数的参数"可以不输入

        (3.2)、

          (3.2.1)、jobject jobj?? = (JNIEnv *)->AllocObject(jclass _clazz??);                   // 创建一个Java对象(未初始化的)
          (3.2.2)、(JNIEnv *)->CallNonvirtualVoidMethod(jobj??, _clazz??, 构造函数的MethodId, 构造函数的参数); // 延迟调用构造函数。在使用对象之前绝对要执行这一步操作

    2、VC6(CPP)的DLL代码:

    #include<stdio.h>
    #include<string>
    using namespace std;
    #include "jniZ_TjniObject.h"
    
    JNIEXPORT void JNICALL Java_jniZ_TjniObject_NativeFunc(JNIEnv * env, jobject obj)
    {
        jclass clazz = env->GetObjectClass(obj);
        jmethodID methodId01 = env->GetMethodID(clazz, "Show", "(Ljava/util/Date;Ljava/lang/String;Ljava/lang/Integer;)V");
    
    // 1、第1种创建Java对象的方法
        // java中java.util.Date的 class对象  
        jclass clazzDate = env->FindClass("java/util/Date");
        // java.util.Date的默认构造函数
        jmethodID mthodidDataConstructor = env->GetMethodID(clazzDate, "<init>", "()V");
        // 使用java.util.Date的默认构造函数,来创建java.util.Date对象
        jobject objDate = env->NewObject(clazzDate, mthodidDataConstructor);
            // java.util.Date 的 函数getTime()
            jmethodID midDateGetTime = env->GetMethodID(clazzDate, "getTime", "()J");  
            //调用getTime方法返回时间
            jlong time = env->CallLongMethod(objDate, midDateGetTime);
            //打印时间,这里要注意的是不能使用cout输出了,因为cout并没有对__int64的输出进行重载,要输出的话用printf("%I64d",time);  
            printf("%I64d
    ", time);  
    
    // 2、第2种创建Java对象的方法
        jclass clazzInteger = env->FindClass("java/lang/Integer");
        jmethodID midIntegerConstructor = env->GetMethodID(clazzInteger, "<init>", "(I)V");
        // Integer没有Integer型参数的构造函数,获取构造函数method id的时候 会报错:"java.lang.NoSuchMethodError: <init>"
        //jmethodID midIntegerConstructor = env->GetMethodID(clazzInteger, "<init>", "(Ljava/lang/Integer;)V");
        if (midIntegerConstructor == NULL)
        {
            printf("midIntegerConstructor == NULL
    ");
            return;
        }
        jobject jobjInteger = env->AllocObject(clazzInteger);
        env->CallNonvirtualVoidMethod(jobjInteger, clazzInteger, midIntegerConstructor, 100);
    
    // *** *** ***
    
        wstring wstr(L"测试字符串ZC123");
        jstring jstr = env->NewString((const jchar*)wstr.c_str(),(jint)wstr.size());
    
        env->CallIntMethod(obj, methodId01, objDate, jstr, jobjInteger);
    }

    3、Java代码:

    package jniZ;
    
    import java.util.Date;
    
    public class TjniObject
    {
        public void Show(Date _date, String _str, Integer _i)
        {
            System.out.println("TjniObject.Show ==> _date : "+_date+" , _str : "+_str+" , _i : "+_i);
        }
        
        public native void NativeFunc();
        
        public static void main(String[] args)
        {
            System.loadLibrary("JniObject_VC6");  
            TjniObject jniZ = new TjniObject();  
            jniZ.NativeFunc();
        }
    }

    4、

    TjniObject.Show ==> _date : Tue Apr 26 13:28:21 CST 2016 , _str : 测试字符串ZC123 , _i : 100
    1461648501955

    5、

  • 相关阅读:
    1388:Lake Counting
    1253 Dungeon Master
    Ubuntu18.04下可以完美运行Quake3 Arena
    Windows下python3生成UTF8的CSV文件和sha256sum踩坑记录
    ROM后缀含义
    Ubuntu18.04下的模拟神器RetroArch
    廉价的SUP掌机拆解
    Python3连接MySQL
    Ubuntu18.04的网络管理netplan和防火墙ufw
    Ubuntu18.04命令行连接WiFi
  • 原文地址:https://www.cnblogs.com/javaskill/p/5434001.html
Copyright © 2011-2022 走看看