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\n", 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\n");
return;
}
jobject jobjInteger = env->AllocObject(clazzInteger);
env->CallNonvirtualVoidMethod(jobjInteger, clazzInteger, midIntegerConstructor, ); // *** *** *** 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、
JNI_Z_08_创建Java对象的更多相关文章
- 除了使用new关键字,还有什么方法可以创建Java对象呢?
今天来盘点一下除了使用 "new" 关键字创建对象,还有什么方法可以创建Java对象呢? 因为是创建对象,所以这里ioc容器不在范围内 我们先看一下常用的new关键字创建 Clas ...
- IntelliJ IDEA平台下JNI编程(五)—本地C代码创建Java对象及引用
本文学习如何在C代码中创建Java对象和对象数组,前面我们学习了C代码中访问Java对象的属性和方法,其实在创建对象时本质上也就是调用构造函数,因此本文知识学习起来也很轻松.有了前面学习数组创建的方法 ...
- Java中JNI的使用详解第四篇:C/C++中创建Java对象和String字符串对象及对字符串的操作方法
首先来看一下C/C++中怎么创建Java对象:在JNIEnv中有两种方法是用来创建Java对象的: 第一种方法: jobject NewObject(jclass clazz , jmethodI ...
- 本地C代码中创建Java对象
作者:唐老师,华清远见嵌入式学院讲师. 创建Java域的对象就是创建Java类的实例,再调用Java类的构造方法. 以Bitmap的构建为例,Bitmap中并没有Java对象创建的代码及外部能访问的构 ...
- 不使用构造方法创建Java对象: objenesis的基本使用方法
转载:http://blog.csdn.net/codershamo/article/details/52015206 objenesis简介: objenesis是一个小型Java类库用来实例化一个 ...
- Java对象创建模式
创建Java对象时,对于可为空的属性,创建对象的时候有3种模式:重叠构造器模式.JavaBeans模式.Builder模式(推荐).Stream模式(推荐). ...
- Java对象大小计算
这篇说说如何计算Java对象大小的方法.之前在聊聊高并发(四)Java对象的表示模型和运行时内存表示 这篇中已经说了Java对象的内存表示模型是Oop-Klass模型. 普通对象的结构如下,按64位机 ...
- Android NDK开发之Jni调用Java对象
https://my.oschina.net/zhiweiofli/blog/114064 通过使用合适的JNI函数,你可以创建Java对象,get.set 静态(static)和 实例(instan ...
- (二)Java对象与内存控制
一.java的类变量和实例变量: java中的变量可分成两种:成员变量和局部变量. 1.局部变量包括以下几类: 方法内的局部变量:作用域为方法体. 代码块内的局部变量:作用域为代码块 形参:方法内的形 ...
随机推荐
- event.preventDefault(); Please enter your name using lowercase letters only.
w 可以用于移动实际项目. 输入 android qq输入法 输入第一个字符“中”后 w PC 点击enter键13 空格键32 w 没有阻挡中午输入. CODE <!DOCTYPE html& ...
- SpringMVC 返回的 json 中去除某些不必要的属性
修改返回的Model,在对应的属性的get方法上使用 com.fasterxml.jackson.annotation.JsonIgnore 注解即可. 如 @JsonIgnore(true) pub ...
- Delphi日期设置为NULL
在某些情况下,需要将日期字段的值置空,这种操作比较麻烦.在操作的时候,可将变量的值(t:TDateTime)设置为0,在操作的过程中进行判断,当t的值为0或-1的时候,时间值为1899年的Delphi ...
- Sum---poj1844(数学题)
题目链接:http://poj.org/problem?id=1844 题意:给一个整数n,求当n由1到k的连续整数加或减组成时的最小的k. 如果n全部由加法组成,那么k可以组成k(k+1)/2,设减 ...
- mysql数据库表插入单条数据/批量插入数据
1.创建表格 reate table trade( id int(4) not null primary key auto_increment, product varchar(30) null, p ...
- Vijos p1303导弹拦截(LIS+贪心)
传送门:https://vijos.org/p/1303 背景 实中编程者联盟为了培养技术精湛的后备人才,必须从基础题開始训练. 描写叙述 某国为了防御敌国的导弹突击,研发出一种导弹拦截系统. 可是这 ...
- static关键字注意事项
/* static关键字注意事项 A:在静态方法中是没有this关键字的 如何理解呢? 静态是随着类的加载而加载,this是随着对象的创建而存在. 静态比对象先存在. B:静态方法只能访问静态的成员变 ...
- kibana 创建饼图
1.在 visualize 里面选择饼图 2.选择数据源 3.选择 terms 聚合类型. 选择字段 xxx.keyword 保存即可.
- python web框架 Django的APP以及目录介绍 django 1.11版本
如果有很多业务请求函数 应该放在app目录 很多业务放在主站上 当用户一点跳到分站 例如 一个项目叫运维平台 他的业务 有资产管理 私有云 监控 不同业务线 chouti项目 - chouti - ...
- C++对象模型那点事儿(布局篇)
1 前言 在C++中类的数据成员有两种:static和nonstatic.类的函数成员由三种:static,nonstatic和virtual. 上篇我们尽量说一些宏观上的东西,数据成员与函数成员在类 ...