JNI(2)

访问字段和方法

JNI允许本地代码访问java 对象的字段和方法。
调用需要两个步骤:
例如调用cls类的f方法,
1. 获取方法ID
jmethodID mid =      env->GetMethodID(cls, “f”, “(ILjava/lang/String;)D”);

2. 然后本地方法可以重复的使用方法ID

jdouble result = env->CallDoubleMethod(obj, mid, 10, str);

报告编程错误

JNI 不会检查编程错误,例如传递null指针或者非法的类型参数。 非法的类型参数包括使用普通对象代替类对象,JNI不检查这些错误的原因是:

  • 检查所有可能的错误会降低本地方法的性能
  • 在很多情况下,没有足够多的运行时信息去做检查
大部分的C库都不会保证一定没有编程错误。例如 printf()方法,当它接收到一个无效的地址时,导致运行时异常,而不是返回一个错误码。

Java 异常

JNI允许本地方法抛出java 异常。本地方法也可以处理java 异常之外的异常。没有处理的java 异常会返回到VM。

异常和错误代码

JNI方法报告错误的方式:通过返回错误码和抛出java 异常。
编程者可以:
  • 根据最后一次JNI调用返回的值判断时候发生了错误
  • 调用一个方法,获取异常对象的详细描述信息。
有两种情况,程序员检查异常不可以先检查错误码:

  • JNI调用java返回结果的方法。必须调用ExceptionOccurred()去检查在java方法运行的时候可能产生的异常。
  • 一些JNI数组访问方法不会返回错误码。但是可能抛出ArrayIndexOutOfBoundsException或者ArrayStoreException.

异步异常

在多线程的情况下,当前线程的线程可能会抛出异步异常。异步异常不会马上影响在当前线程执行的本地方法,直到:
  • 本地方法调用JNI方法时,能够抛出异步异常,或者
  • 本地方法明确使用ExceptionOccurred()检查同步和异步异常。

异常处理

在本地方法中有两种方式可以处理异常:

  • 本地方可以抛出java异常
  • 本地方法可以调用ExceptionClear()清楚异常,然后执行自己的异常处理。
当一个异常抛出,本地代码必须先清除异常,然后才能调用其他的JNI方法。当有一个挂起的异常时,JNI方法可以安全的调用:
  ExceptionOccurred()
ExceptionDescribe()
ExceptionClear()
ExceptionCheck()
ReleaseStringChars()
ReleaseStringUTFChars()
ReleaseStringCritical()
Release<Type>ArrayElements()
ReleasePrimitiveArrayCritical()
DeleteLocalRef()
DeleteGlobalRef()
DeleteWeakGlobalRef()
MonitorExit()
PushLocalFrame()
PopLocalFrame()

JNI(2)的更多相关文章

  1. android studio 使用 jni 编译 opencv 完整实例 之 图像边缘检测!从此在andrid中自由使用 图像匹配、识别、检测

    目录: 1,过程感慨: 2,运行环境: 3,准备工作: 4,编译 .so 5,遇到的关键问题及其解决方法 6,实现效果截图. (原创:转载声明出处:http://www.cnblogs.com/lin ...

  2. 【走过巨坑】android studio对于jni调用及运行闪退无法加载库的问题解决方案

    相信很多小伙伴都在android开发中遇到调用jni的各种巨坑,因为我们不得不在很多地方用到第三方库so文件,然而第三方官方通常都只会给出ADT环境下的集成方式,而谷歌亲儿子android studi ...

  3. Android游戏开发实践(1)之NDK与JNI开发03

    Android游戏开发实践(1)之NDK与JNI开发03 前面已经分享了两篇有关Android平台NDK与JNI开发相关的内容.以下列举前面两篇的链接地址,感兴趣的可以再回顾下.那么,这篇继续这个小专 ...

  4. JNI 备注

    本文记录一个基础的JNI例子及过程中遇到的问题解决. 1.定义一个JAVA类如下: package jnidemo01; public class JniHello { public native v ...

  5. Android游戏开发实践(1)之NDK与JNI开发01

    Android游戏开发实践(1)之NDK与JNI开发01 NDK是Native Developement Kit的缩写,顾名思义,NDK是Google提供的一套原生Java代码与本地C/C++代码&q ...

  6. Android游戏开发实践(1)之NDK与JNI开发02

    Android游戏开发实践(1)之NDK与JNI开发02 承接上篇Android游戏开发实践(1)之NDK与JNI开发01分享完JNI的基础和简要开发流程之后,再来分享下在Android环境下的JNI ...

  7. 关于jni编译32位、64位动态库(Android.mk和Application.mk文件)

    最近新项目需要编译64位的动态库,这里记录如何配置. 在jni目录下加入Android.mk和Application.mk文件. Application.mk APP_ABI := armeabi a ...

  8. android JNI 调用NDK方法

    @import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/c ...

  9. jni操作jobject

    一. 注册JNI函数 1.         静态方法 一般使用javah进行编译,生成很长的文件名和函数名字,这个书写不方便,影响运行效率. 2.         动态注册 使用JNINativeMe ...

  10. JNI开发的常见错误

    1. 写错了load的library java.lang.UnsatisfiedLinkError: Couldn't load hell0: findLibrary returned null 2. ...

随机推荐

  1. linux install nginx error

    1 2 3 4 5 6 7 8 9 10 11 [mahao01@127.0.0.1 nginx-1.2.9]$ make make -f objs/Makefile make[1]: Enterin ...

  2. (转)C++笔记:面向对象编程基础

    非常棒的总结 http://blog.csdn.net/liufei_learning/article/details/21312701 面向对象编程基础 面向对象编程基于三个基本概念: 数据抽象-类 ...

  3. poj 1206

    /** 题意: 给定一序列,置换k次之后 输出其状态 置换: 考察循环节长度, 思路: 分别求出每个元素的循环节的大小,用k 模其大小,大的k次之后的位置, 输出即可 **/ #include < ...

  4. HDOJ-ACM Steps

    在这里放几道Steps里的题目把. find your present (2) Time Limit: 1000/2000 MS (Java/Others) Memory Limit: 32768/1 ...

  5. Linux 查看文件

    1: cat file_full_name  这种方法适合查看小文件 cat /etc/services cat -n file_full_name -n 可以加行号! 2: tac file_ful ...

  6. Python3.2官方文档翻译--作用域和命名空间

    6.2 Python作用域和命名空间 在介绍类之前.首先我想告诉你一些关于python作用域的规则. 类的定义很巧妙地运用了命名空间,你须要知道范围和命名空间的工作原理以能全面了解接下来发生的. 顺便 ...

  7. Tomcat 的context.xml

    1. 在tomcat 5.5之前: --------------------------------------------------------------- Context体如今/conf/se ...

  8. linux之多进程fork:进程通信

    ++++++++++++++++++信号机制+++++++++++++++++++ 接收信号 int signal(int sig,__sighandler_t handler); int func( ...

  9. PDFium-PDF开源之旅(1)-初探代码下载编译

    近日,Google和Foxit合作开源了Foxit的PDF源代码. 叫PDFium 相关新闻不少.哈,虽说已经不是程序猿了.只是还是有兴趣跑起来围观看看.废话少说.先说编译代码的步骤(事实上Googl ...

  10. linux之线程

    http://blog.csdn.net/lanyan822/article/details/7586845 POSIX线程数据类型: pthread_t 线程标识符: pthread_mutex_t ...