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对象的更多相关文章

  1. 除了使用new关键字,还有什么方法可以创建Java对象呢?

    今天来盘点一下除了使用 "new" 关键字创建对象,还有什么方法可以创建Java对象呢? 因为是创建对象,所以这里ioc容器不在范围内 我们先看一下常用的new关键字创建 Clas ...

  2. IntelliJ IDEA平台下JNI编程(五)—本地C代码创建Java对象及引用

    本文学习如何在C代码中创建Java对象和对象数组,前面我们学习了C代码中访问Java对象的属性和方法,其实在创建对象时本质上也就是调用构造函数,因此本文知识学习起来也很轻松.有了前面学习数组创建的方法 ...

  3. Java中JNI的使用详解第四篇:C/C++中创建Java对象和String字符串对象及对字符串的操作方法

    首先来看一下C/C++中怎么创建Java对象:在JNIEnv中有两种方法是用来创建Java对象的: 第一种方法: jobject  NewObject(jclass clazz  , jmethodI ...

  4. 本地C代码中创建Java对象

    作者:唐老师,华清远见嵌入式学院讲师. 创建Java域的对象就是创建Java类的实例,再调用Java类的构造方法. 以Bitmap的构建为例,Bitmap中并没有Java对象创建的代码及外部能访问的构 ...

  5. 不使用构造方法创建Java对象: objenesis的基本使用方法

    转载:http://blog.csdn.net/codershamo/article/details/52015206 objenesis简介: objenesis是一个小型Java类库用来实例化一个 ...

  6. Java对象创建模式

    创建Java对象时,对于可为空的属性,创建对象的时候有3种模式:重叠构造器模式.JavaBeans模式.Builder模式(推荐).Stream模式(推荐).                     ...

  7. Java对象大小计算

    这篇说说如何计算Java对象大小的方法.之前在聊聊高并发(四)Java对象的表示模型和运行时内存表示 这篇中已经说了Java对象的内存表示模型是Oop-Klass模型. 普通对象的结构如下,按64位机 ...

  8. Android NDK开发之Jni调用Java对象

    https://my.oschina.net/zhiweiofli/blog/114064 通过使用合适的JNI函数,你可以创建Java对象,get.set 静态(static)和 实例(instan ...

  9. (二)Java对象与内存控制

    一.java的类变量和实例变量: java中的变量可分成两种:成员变量和局部变量. 1.局部变量包括以下几类: 方法内的局部变量:作用域为方法体. 代码块内的局部变量:作用域为代码块 形参:方法内的形 ...

随机推荐

  1. 获取当前日期和农历的js代码

    来自:http://www.cnblogs.com/Gnepner/archive/2011/09/07/2169822.html 获取当前日期 getToday.js: function GetCu ...

  2. JavaScript dotAll模式

    JavaScript正则表达式中点(.)是一个特殊字符,它可以匹配除了一下条件的任意字符. 四个字节的UTF-16字符 换行符(\n) 回车符(\r) 行分隔符 段分隔符 为了使点(.)可以匹配任意字 ...

  3. LAMP兄弟连 视频教程集

    电驴的资源:http://www.verycd.com/topics/2843130/?ref=msg

  4. Python3+Selenium3自动化测试-(三)

    selenium键盘事件 #coding=utf-8 from selenium import webdriver import time from selenium.webdriver.common ...

  5. 关于java.lang.NoSuchMethodError: org.slf4j.spi.LocationAwareLogger.log

    配置JFinal环境时,jar包已导入,web.xml已配置,Config也已经配置好,测试服务器时不停地出现 Exception in thread "main" java.la ...

  6. Java AES512加密算法

    AES - 高级加密标准: 高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准.这 ...

  7. 简明python教程六----编写一个python脚本

    备份程序: #!/usr/bin/python #Filename:backup_ver1.py import os import time source = ['/home/liuxj/python ...

  8. beego——获取参数

    1.获取参数 我们经常需要获取用户传递的数据,包括Get.POST等方式的请求,beego里面会自动解析这些数据,你可以通过如下方式获取数据: GetString(key string) string ...

  9. zend studio设置utf8

    1. windows -> preference -> general -> workspace 2.项目右键 -> properities -> resource 3. ...

  10. (转)CTO的烦恼:为啥差距就这么大呢?

    话说胖哒是一只CTO,近来遇到了一些小烦恼… 胖哒表示这么多问题想想就头大啊! 一直听说用Docker解决问题不错,于是两个月前,胖哒不远万里来到DockerCon 16,打算向国外的Docker先行 ...