`
abc20899
  • 浏览: 909074 次
  • 性别: 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详解

    JAVA语言及其标准API(应用程序编程接口)应付应用程序的编写已绰绰有余。但在某些情况下,还是必须使用非JAVA编码。例如,我们有时要访问操作系统的专用特性,与特殊的硬件设备打交道,重复使用现有的非Java接口,...

    JNI技术各类文档

    jni详解 JNI设计实践之路 JNI技术手册 Java_JNI_编程进阶 android_jni操作指南

    Android 深入研究JNI详解

    此时,VM扮演着桥梁的角色,让Java与C组件能通过标准的JNI介面而相互沟通。 应用层的Java类是在虚拟机(VM: Vitual Machine)上执行的,而C件不是在VM上执行,那么Java程式又如何要求VM去载入(Load)所指定的C组件呢?...

    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的内幕和使用,希望对你有所帮助

    Java本地调用JNI使用规范详解.doc

    本文档主要讲述的是Java本地调用JNI使用规范详解;JNI概述;JavaNative Interface的缩写,中文为Java本地调用。从Java1.1开始,JNI即成为Java标准的一部分。 JNI设计的目的是为了允许Java代码与其他语言进行交互。但...

    android jni详解

    Android调用C++接口调用技术Java Native Interface(JNI)详解,

    jni详解高清pdf文档

    介绍了Android下jni的使用,使用学习使用。

    Java和JNI读取android apk里assets文件夹示例demo

    Java和JNI读取android apk里assets文件夹示例demo,参见博客详解: http://blog.csdn.net/yanzi1225627/article/details/20577059

    java 通过jni查看windows的CPU利用率的问题

    博文链接:https://huangpengxiao.iteye.com/blog/96670

    JNI详解学习

    JNI详解学习

    JNI使用规范详解.pdf

    JNI,全称为Java Native Interface,即Java本地接口,JNI是Java调用Native 语言的一种特性。通过JNI可以使得Java与C/C++机型交互。即可以在Java代码中调用C/C++等语言的代码或者在C/C++代码中调用Java代码。由于JNI...

    关于JNI详解及笔记

    JNI是现在app开发必须要了解的,本人将jni实现java与c互相调用的原理以及实现做了详细的讲解,希望对大家有所帮助

    JNI资料合集

    Java本地接口(JNI)编程指南和规范2 jni详解 两个电子书籍!

    The Java Native Interface jni

    JNI技术详解,帮你快速掌握Java调用C/C++的JNI技术。

    传智播客JAVA全套种子共20G

    《jpa详解视频教程》165M 《spring2.5视频教程》365M 《传智播客_AJAX视频教程》1.27G 《传智播客_FTP视频教程》117M 《传智播客_hibernate视频教程》573M 《传智播客_俄罗斯方块游戏开发_视频教程》217M 《传智播客...

    在Java应用程序中使用JNI来监视CPU详解

    一般来说,JNI有点复杂。但是,如果你仅仅单向调用--从Java调用本地代码,并且仅使用基本型进行通讯--事情还是很简单的。本文介绍了在Java中声明JNI方法,给出了在Java应用程序中使用JNI来监视CPU的实例。

    传智播客精品就业班JAVA种子

    《传智播客_王泽佑_JNI教程》173M 《传智播客_张孝祥_javascript教程》1.12G 《传智播客_张孝祥_java高级视频》797M 《传智播客_张孝祥_java基础教程》1.6G 《传智播客fckeditor视频教程》173M 《传智播客java...

    NDK(jni)java调C 全套代码

    代码 NDK1-1HelloWorld NDK1-2NDKStringTYPE NDK1_3NDKDTRegist NDK1_4NDKAccessFile NDK1_5CallJavaMethod NDK1_6javaThreadCallC NDK1_7CThreadCallJava 文档 JNI JNI详解

    Android下JNI入门详解

    适合对JNI尚不了解的开发者。介绍如何在Android环境下使用JNI已达到java与C/C++函数互调,描述如何在VM中调用C/C++函数。

Global site tag (gtag.js) - Google Analytics