jni 创建java对象_JNI_Z_08_创建Java对象

1、步骤 :

(1)、获取 jclass

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

(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#include

using namespacestd;

#include"jniZ_TjniObject.h"JNIEXPORTvoid 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, "", "()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\n", time);//2、第2种创建Java对象的方法

jclass clazzInteger = env->FindClass("java/lang/Integer");

jmethodID midIntegerConstructor= env->GetMethodID(clazzInteger, "", "(I)V");//Integer没有Integer型参数的构造函数,获取构造函数method id的时候 会报错:"java.lang.NoSuchMethodError: "//jmethodID midIntegerConstructor = env->GetMethodID(clazzInteger, "", "(Ljava/lang/Integer;)V");

if (midIntegerConstructor ==NULL)

{

printf("midIntegerConstructor == NULL\n");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代码:

packagejniZ;importjava.util.Date;public classTjniObject

{public voidShow(Date _date, String _str, Integer _i)

{

System.out.println("TjniObject.Show ==> _date : "+_date+" , _str : "+_str+" , _i : "+_i);

}public native voidNativeFunc();public static voidmain(String[] args)

{

System.loadLibrary("JniObject_VC6");

TjniObject jniZ= newTjniObject();

jniZ.NativeFunc();

}

}

4、

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

1461648501955

5、

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值