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. B实习面试

    1. 多态和继承关系,继承的几种实现机制? 实现多态,有二种方式,覆盖,重载. 覆盖,是指子类重新定义父类的虚函数的做法. 重载,是指允许存在多个同名函数,而这些函数的参数表不同(或许参数个数不同,或 ...

  2. 【转】Eclipse自动补全的设置方法

    转自:http://blog.csdn.net/xiadasong007/archive/2009/11/11/4799715.aspx 打开 Eclipse -> Window -> P ...

  3. IIS上不能播放mp4

    iis不支持mp4格式,需要手动添加. 进入iis服务管理器,打开你的网站,然后点击MIME类型---添加(扩展名:mp4   MIME类型:application/octet-stream) 如此即 ...

  4. 学习笔记--C#特性Attribute(一)

    这个框框好烦人啊,删不掉 一.背景 [serializable] public class Person(){} 这是我第一次看到特性(Attribute),那时我还不知道这是什么,怎么会有这种写法, ...

  5. poj 3740 Easy Finding 精确匹配

    题目链接 dlx的第一题, 真是坎坷..... #include <iostream> #include <vector> #include <cstdio> #i ...

  6. 配置Raspbian 启用SPI I2C

    sudo vi /etc/modprobe.d/raspi-blacklist.conf 找到这两行 blacklist spi-bcm2708 blacklist i2c-bcm2708 注释掉 # ...

  7. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">的含义

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/x ...

  8. pl sql 无法解析指定的连接标识符

        使用PLSQL Developer时,“ORA-12154: TNS:无法解析指定的连接标识符”问题的一个解决办法< xmlnamespace prefix ="o" ...

  9. 注册UBER(优步)司机常见问题,如何注册uber(优步)司机

    如何注册uber(优步)司机,怎么注册UBER(优步)司机 此链接为优步内部人员推荐,优先审核,基本当天就能收到短信,注意上传证件照清晰点. https://uber.avosapps.com/ref ...

  10. TRIZ系列-创新原理-21-高速通过原理

    高速通过原理,有的书也译为"降低有害作用的时间"原理,我比較倾向于叫高速通过原理,这个概念下,适用范围比較大些.高速通过原理的详细描写叙述例如以下:1)很高速的实施有害的或者有危急 ...