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、

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