`
abc20899
  • 浏览: 928889 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java_jni详解_04

 
阅读更多
public class ObjectArrayTest{
	
   public static native int[][] init2DArray(int size);  //声明本地方法
   
   public static void main(String[] args) {
	   int i2arr[][] = init2DArray(3);
	   for (int i = 0; i < 3; i++) {
		 for (int j = 0; j < 3; j++) {
			 System.out.print(" "+i2arr[i][j]);
		 }
		 System.out.print(" ");
	   }
   }
   
   static{
	   //System.loadLibrary("helloworld"); // 加载库文件
	   System.load("/Users/zhaoshun/solibs/libObjectArrayTest.so");
   }
}

/**
     原型
	 * Class:     jni_sample_ObjectArrayTest
	 * Method:    init2SArray
	 * Signature: (I)[[I
	 *
	JNIEXPORT jobjectArray JNICALL Java_jni_sample_ObjectArrayTest_init2DArray(JNIEnv *, jclass, jint);
	
	输出结果:
	 0 1 2  1 2 3  2 3 4 
 */ 




#include <jni.h>
#include <stdio.h>  
#include "jni_sample_ObjectArrayTest.h"
// printf 在stdio.h头文件中
JNIEXPORT jobjectArray JNICALL Java_jni_sample_ObjectArrayTest_init2DArray(JNIEnv *env, jclass cls, jint size)
{
	jobjectArray result;
	int i;
	jclass intArrCls = (*env)->FindClass(env,"[I");
	if(intArrCls == NULL){
		return NULL;  /* exception thrown */
	}
	result = (*env)->NewObjectArray(env,size,intArrCls,NULL);
    if(result == NULL){
	   return NULL; /* out of memory error thrown */
    }

    for (i = 0;i<size;i++) {
	  jint tmp[256];  /* make sure it is large enough! */
	  int j;
	  jintArray iarr = (*env)->NewIntArray(env,size);
	  if(iarr == NULL){
		return NULL;
	  }
	  for (j=0;j<size;j++) {
		tmp[j] = i+j;
	  }
	  (*env)->SetIntArrayRegion(env, iarr, 0, size, tmp); 
	  (*env)->SetObjectArrayElement(env, result, i, iarr); 
	  (*env)->DeleteLocalRef(env, iarr);
    }
	return result;
}

/**
newInt2DArray方法首先调用FindClass获得一个一维int数组. "[I"作为JNI类描述符 等价于Java int[]声明。FindClass当装载类失败,返回NULL(可能是没找到类或内存不足)。

  注意
	类描述符,也可以叫做"类签名"。签名的作用:为了准确描述一件事物. Java Vm定义 了类签名,方法签名;其中方法签名是为了支持方法重载。
	FindClass 返回 NULL 的原因:
	• 提供了错误的类描述符
	• 无法在当前ClassLoader上下文中找到类
	解决办法:
	• 认真检查类描述符是否正确
	• 以"/"作为包分隔符,即类描述符的形式为"xxx/xxx/xxx",而非"xxx.xxx.xxx",也
	可简单记忆为"/"用在本地形式(或虚拟机)中;"."分隔符,用在 Java(Java Programming Language)环境中;并且类描述符末尾没有".java",如 FindClass("java/lang/String")而非 FindClass("java/lang/String.java")
	• 构造ClassLoader,并利用Class.forName(String name, boolean initialize, ClassLoader loader)装载类
	其中第三个解决办法比较复杂,涉及到 Java 的双亲委派模型,类与对象相容性判定等问 题,将有专门文章阐述。
	
然后调用 NewObjectArray 分配一个对象数组。注意,"基本类型数组"这是个整体的概念, 它是一个对象。后面我们要填充它。
注意,DeleteLocalRef 是释放局部对象引用。

*/



分享到:
评论

相关推荐

    Java_JNI_获得系统进程信息实例.doc

    ### Java与JNI结合获取系统进程信息的实现 #### 概述 在《Java_JNI_获得系统进程信息实例.doc》中,我们探索了一个利用Java Native Interface (JNI)来获取操作系统进程信息的示例项目。该项目由三个主要部分组成:`...

    JniCallback.zip_Android jni_android_jni android_jni callback_jni

    在Android开发中,JNI(Java Native Interface)是一个关键的技术,它允许Java代码和其他语言写的代码进行交互。JNI在很多场景下都非常有用,比如优化性能、使用现有的C/C++库、或者像在这个“JniCallback.zip”文件...

    jni.rar_Android jni_JAVA串口 JNI_android_android RS232_jni

    《Android JNI串口通信实践详解》 在移动设备开发领域,Android系统因其开源特性与丰富的功能,成为开发者们的首选平台。然而,对于某些特定的硬件交互,如串口通信(RS232),原生Java API往往无法满足需求,这时...

    Java_JNI_编程进阶.pdf

    ### Java JNI 编程进阶知识点详解 #### 一、JNI技术概述 JNI(Java Native Interface,Java本地接口)是一种框架,它允许Java代码与其他语言(如C、C++)编写的代码进行交互。这种交互能力对于提升Java应用程序的...

    ltp4j的6个静态和动态库,parser_jni.lib,parser_jni.dll,parser_jni.dll等

    LTP4J的核心在于其提供的静态库(parser_jni.lib)和动态库(如parser_jni.dll),这些库文件是C++编写的底层实现,通过JNI(Java Native Interface)技术与Java代码进行交互。JNI允许Java代码直接调用C/C++的函数,...

    JNI.rar_JNI pdf_jni

    在JNI详解与实现的PDF文档中,可能会涵盖以下几个主要知识点: 1. **JNI基础知识**:介绍JNI的概念,它的历史,以及为何需要使用JNI。这通常包括Java平台的结构,如何在Java中创建本地方法,以及JNI头文件和库的...

    hello-jni.rar_ android jni_android hello jni_android jni hellojn

    《Android NDK与JNI开发详解:从Hello-JNI入门》 Android系统以其开源性和灵活性吸引了大量的开发者,而JNI(Java Native Interface)则是Android平台中连接Java层与原生C/C++代码的重要桥梁。JNI允许开发者在...

    java调用JNI

    Java调用JNI详解 Java Native Interface(JNI)是Java虚拟机(JVM)与native代码之间的接口,允许Java程序调用native代码,反之亦然。本文将详细介绍如何使用Java的JNI调用C++的DLL包。 JNI的作用 JNI的主要作用...

    Android 深入研究JNI详解

    ### Android深入研究JNI详解 #### 一、JNI与Android中的.so库载入 在深入了解JNI(Java Native Interface)之前,我们需要明确一点:Android应用程序的主要部分是基于Java开发的,并且这些Java类会被编译成Dex格式...

    android_ndk_jni_dev_HelloNDK.zip

    《Android NDK与JNI开发详解:HelloNDK实践》 Android Native Development Kit(NDK)是Google提供的一款工具集,允许开发者在Android平台上使用C/C++编写原生代码,从而提高应用程序的性能和效率。JNI(Java ...

    libusb_jni

    `libusb`是一个开源的C库,用于跨平台的USB编程,而JNI(Java Native Interface)则是Java平台的一部分,用于连接Java代码与本地(非Java)代码,如C或C++。将`libusb`与JNI结合,开发者可以编写Java应用,同时利用`...

    nextouch_jni_demo.zip

    【JNI技术详解】 JNI(Java Native Interface)是Java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI在Android开发中扮演着重要的角色,尤其是当开发者需要利用C/C++库或者提高性能时。本教程将围绕...

    jni.rar_android_avilib_jni

    《Android平台上的JNI与avilib库的整合应用详解》 在Android开发中,JNI(Java Native Interface)是一种关键的技术,它允许Java代码与其他语言(如C++)进行交互,为高性能计算、系统调用或者利用已有的C/C++库...

    me_JNI_demo

    #### 三、JNI的工作流程详解 根据给定的文件内容,我们可以深入探讨一个简单的JNI示例,该示例展示了如何创建一个Java类,以及如何使用JNI调用C语言编写的函数。 1. **创建Java类** ```java package cn; public ...

    Android深入研究JNI详解.pdf

    Android 深入研究 JNI 详解 JNI(Java Native Interface)是 Java 平台的一部分,允许 Java 代码和其他语言编写的代码进行交互。JNI 是本地编程接口,使得在 Java 虚拟机(VM)内部运行的 Java 代码能够与用其他...

    5本 jni 资料

    5本JNI资料,非常详细; 1.android_jni操作指南.pdf 2.JNI设计实践之路.pdf 3.jni详解.pdf 4.Java_JNI_编程进阶.pdf 5.Android_JNI总结.doc

    有关java jni详解

    ### 有关Java JNI详解 #### 一、JNI概述与重要性 Java Native Interface(JNI)是一种重要的技术,它允许Java代码与其他语言(主要是C和C++)编写的代码进行交互。这种交互能力使得开发者能够在利用Java平台的强大...

    jni详解高清pdf文档

    ### JNI详解:深入理解Java Native Interface #### 一、引言与翻译初衷 JNI(Java Native Interface)作为连接Java世界与本地C/C++世界的桥梁,其重要性不容小觑。本文旨在详细介绍Android环境下JNI的使用,帮助...

    android_jni操作指南.pdf

    ### Android JNI 操作指南知识点详解 #### 一、概述 JNI (Java Native Interface) 是 Java 平台标准的一部分,它允许 Java 代码和其他语言写的代码进行交互。在 Android 开发中,通过 NDK (Native Development Kit)...

Global site tag (gtag.js) - Google Analytics