• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >Java > IntelliJIDEA平台下JNI编程(五)—本地C代码创建Java对象及引用

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

作者:huachao1001的专栏 字体:[增加 减小] 来源:互联网 时间:2017-07-23

huachao1001的专栏通过本文主要向大家介绍了JNI,idea,java等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

转载请注明出处:【huachao1001的专栏:http://blog.csdn.net/huachao1001/article/details/65446070】

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

1. C代码创建Java对象

创建Java对象本质就是调用构造函数,这与上一篇文章中提到的调用方法使用方法一致。下面直接贴代码:

package com.huachao.java;

/**
 * Created by HuaChao on 2017/03/23.
 */

public class HelloJNI {


    static {
        System.loadLibrary("HelloJNI");
    }

    private String name;

    private HelloJNI(String name) {
        this.name = name;
    }


    public static native HelloJNI getInstance();


    public static void main(String[] args) {
        HelloJNI obj = HelloJNI.getInstance();
        System.out.println(obj.name);

    }

}

接下来在c代码中完成对getInstance()的实现。

#include<jni.h>
#include <stdio.h>
#include "com_huachao_java_HelloJNI.h"

JNIEXPORT jobject JNICALL Java_com_huachao_java_HelloJNI_getInstance
  (JNIEnv * env,jobject thisObj){

        jclass cls = (*env)->FindClass(env, "com/huachao/java/HelloJNI");

        //获取构造函数的ID
        jmethodID midInit = (*env)->GetMethodID(env, cls, "<init>", "(Ljava/lang/String;)V");
        if (NULL == midInit) return NULL;
        // 调用构造函数
        jstring name=(*env)->NewStringUTF(env, "HuaChao");
        jobject newObj = (*env)->NewObject(env, cls, midInit, name);

        return newObj;
}

有一点需要注意,在调用HellJNI(String name)构造函数时,需要先将c的本地字符串转为jstring类型,即调用NewStringUTF函数,再作为参数传入。运行结果如下:

HuaChao

2. C代码创建对象数组

创建对象数组其实就是结合对象的创建和数组的创建来实现,都是前面学过的知识。在HelloJNI.java中加入getArray函数,并且修改main函数如下:

 public static native HelloJNI[] getArray(String[] names);

 public static void main(String[] args) {
      String[] names = {"HuaChao", "Lianjin"};
      HelloJNI[] arr = HelloJNI.getArray(names);
      for (HelloJNI obj : arr) {
          System.out.println("name:" + obj.name);
      }

  }

在本地C代码中,对应getArray函数的实现如下:

JNIEXPORT jobjectArray JNICALL Java_com_huachao_java_HelloJNI_getArray
 (JNIEnv * env,jobject thisObj,jobjectArray names){

      // 获取HelloJNI类的引用
       jclass clazz = (*env)->FindClass(env, "com/huachao/java/HelloJNI");
       //获取构造函数的ID
       jmethodID midInit = (*env)->GetMethodID(env, clazz, "<init>", "(Ljava/lang/String;)V");
       // 获取数组长度
       jsize length = (*env)->GetArrayLength(env, names);
       jobjectArray outJNIArray = (*env)->NewObjectArray(env, length, clazz, NULL);
       //遍历names数组
       int i;
       for (i = 0; i < length; i++) {
          jstring name = (*env)->GetObjectArrayElement(env, names, i);
          if (NULL == name)
                return NULL;
           jobject newObj = (*env)->NewObject(env, clazz, midInit, name);
          (*env)->SetObjectArrayElement(env, outJNIArray, i, newObj);
       }

       return outJNIArray;
 }

最后,运行如下:

name:HuaChao
name:Lianjin

3. C代码对Java类的局部和全局引用

与Java代码类似,在C代码函数里面创建的对象时,对对象的引用为局部引用,当函数执行结束时,引用无效。但是如果在函数外对对象进行引用,引用会一直有效,直到程序结束。前面我们频繁地用到了jclass和jmethodID以及jfieldID,下面我们尝试将其作为c代码的全局引用。

首先看看Java中代码。

package com.huachao.java;

/**
 * Created by HuaChao on 2017/03/23.
 */

public class HelloJNI {


    static {
        System.loadLibrary("HelloJNI");
    }

    private String name;

    private HelloJNI(String name) {
        this.name = name;
    }


    public static native HelloJNI getInstance();


    public static void main(String[] args) {
        HelloJNI obj1 = HelloJNI.getInstance();
        HelloJNI obj2 = HelloJNI.getInstance();
        System.out.println("obj1:--->>name=" + obj1.name);
        System.out.println("obj2:--->>name=" + obj2.name);
    }

}

然后在C代码中,将jclass和jmethodID对象作为全局变量

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • IntelliJIDEA平台下JNI编程(五)—本地C代码创建Java对象及引用
  • Java进阶:JNI使用技巧点滴

相关文章

  • 2017-05-28Serializable接口的作用_动力节点Java学院整理
  • 2017-05-28Java 继承方法实例详解
  • 2017-05-28Spring Boot如何使用Spring Security进行安全控制
  • 2017-05-28java 代理模式及动态代理机制深入分析
  • 2017-05-28FineReport中自定义登录界面的方法
  • 2017-05-28详解Spring 基于 Aspect 注解的增强实现
  • 2017-05-28详解spring security 配置多个AuthenticationProvider
  • 2017-05-28详解Spring boot+CXF开发WebService Demo
  • 2017-05-28详解利用Spring加载Properties配置文件
  • 2017-05-28Java 解决死锁的方法实例详解

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • Java正则表达式实现在文本中匹配查找换行符的方法【经典实例】
    • 详解SpringBoot AOP 拦截器(Aspect注解方式)
    • Hibernate三种状态和Session常用的方法
    • 详解spring+springmvc+mybatis整合注解
    • Java代理模式详细解析
    • SpringMVC中解决@ResponseBody注解返回中文乱码问题
    • 浅谈java中的路径表示
    • 详解Spring Boot整合Mybatis实现 Druid多数据源配置
    • 基于SSM框架之个人相册示例代码
    • Java多线程并发编程 Volatile关键字

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有