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.局部变量包括以下几类: 方法内的局部变量:作用域为方法体. 代码块内的局部变量:作用域为代码块 形参:方法内的形 ...
随机推荐
- Servlet监听器与Timer定时器配合实现JAVA WEB应用简单自动作业
在web应用中,有时候客户需要一些定时程序,不需要客户自己去操作,而是由应用程序自行触发执行某些操作.这个时候监听与定时器的配合使用就基本可以实现这个需求了. 1.创建一个监听的SERVELET,这个 ...
- C#操作AD及Exchange Server总结(二)
上一节C#操作AD及Exchange Server总结(一)写了对AD的操作,新建AD用户后,通常都需要为此用户开启Exchange邮箱,接下来写如何远程操作Exchange. 三.对Exchange ...
- 获取当前日期和农历的js代码
来自:http://www.cnblogs.com/Gnepner/archive/2011/09/07/2169822.html 获取当前日期 getToday.js: function GetCu ...
- SQSERVER--函数、开窗函数,-特殊的内容 (for xml path )
1.STUFF SQL Server之深入理解STUFF sql stuff函数用于删除指定长度的字符,并可以在制定的起点处插入另一组字符.sql stuff函数中如果开始位置或长度值是负数,或者如果 ...
- 我的Android进阶之旅------>Android Activity的singleTask加载模式和onActivityResult方法之间的冲突
今天调试一个bug的时候,情景如下: 一个Activity A,需要用startActivityForResult方法开启Activity B.Activity B的launch mode被设置为si ...
- Springboot入门-配置异常页面
springboot中,可以使用org.springframework.boot.context.embedded.EmbeddedServletContainerCustomizer类来统一的处理异 ...
- APP数据埋点分类方式
1.数据埋点的重要性 在现实工作中,数据的整体流程为:数据生产-数据采集-数据处理-数据分析和挖掘-数据可视化,其中,数据采集是很重要的一个环节,数据采集得全不全.对不对,直接决定数据广度和质 ...
- 连接postgresql
# psycopg2 engine=create_engine('postgresql+psycopg2://scott:tiger@localhost/mydatabase')# python 连 ...
- python全栈开发之OS模块的总结
OS模块 1. os.name() 获取当前的系统 2.os.getcwd #获取当前的工作目录 import os cwd=os.getcwd() # dir=os.listdi ...
- 本地连不上远程mysql数据库(1)
Ubuntu 16.04下开启Mysql 3306端口远程访问 0. 前言 网上看到很多开启Mysql远程访问端口,修改的配置文件我都没有找到. 特意查看了我的Linux版本 $ sudo lsb ...