`
anson_xu
  • 浏览: 514598 次
  • 性别: Icon_minigender_1
  • 来自: 惠州
社区版块
存档分类

Android jni 常用方法备忘

 
阅读更多
Android jni 常用方法备忘
作者: Venus | 时间: 2011-03-02 | 分类: Android, IT技术 | 分享次数: 296 次 | 快来吐槽

有关Android JNI开发中比较强大和有用的功能就是从JNI层创建、构造Java的类或执行Java层的方法获取属性等操作。
一、类的相关操作

1. jclass FindClass(JNIEnv *env, const char *name); 查找类

该函数可能做过Java开发的不会陌生,这个是JNI层的实现,需要注意的是第二个参数为const char*类型的,我们如果从Java从层传入unicode编码的jstring类型需要使用GetStringUTFChars函数转换成utf8的 const char*,如果成功返回这个Java类的对象jclass,相关的异常可能有
-

(1. ClassFormatError 类的数据格式无效
(2. ClassCircularityError 该类或接口是自身的超类或超接口
(3. NoClassDefFoundError 没有找到指定名称的类或接口
(4. OOM内存不足错误,即OutOfMemoryError

2. jclass GetSuperclass(JNIEnv *env, jclass clazz); 获取父类或者说超类

该函数的第二个参数为jclass类,我们调用时传入的是子类,否则返回将是NULL

3. jboolean IsAssignableFrom(JNIEnv *env, jclass clazz1,jclass clazz2); 判断class1对象能否安全的强制转换为class2对象

如果可以将返回 JNI_TRUE,JNI_TRUE的定义值为1,否则返回JNI_FALSE即0 ,这里Android123详细说明下哪些情况可能返回真:

(1 这两个类参数引用同一个 Java 类
(2 第一个类是第二个类的子类
(3 第二个类是第一个类的某个接口

4. jclass GetObjectClass(JNIEnv *env, jobject obj); 通过对象获取这个类
该函数比较简单,唯一注意的是对象不能为NULL,否则获取的class肯定返回也为NULL。

5. jboolean IsInstanceOf(JNIEnv *env, jobject obj,jclass clazz); 判断对象是否为某个类的实例

这个函数是JNI层的实现,相信大家都不陌生,Android开发网提醒大家需要注意的是返回值可能产生异议,就是如果传入的第二个参数为NULL对象,NULL对象可以强制转换为各种类,所以这种情况也将会返回JNI_TRUE,所以一定判断传入的对象是否为空。

6. jboolean IsSameObject(JNIEnv *env, jobject ref1,jobject ref2); 判断两个对象是否引用同一个类

需要注意的是如果两个对象均为空,返回的值也会是JNI_TRUE所以使用时判断对象为空。
二、调用Java方法

首先说下有关签名sig相关的比如 “Ljava/lang/String;”

1. jmethodID GetMethodID(JNIEnv *env, jclass clazz,const char *name, const char *sig); 获取一个Java方法的ID

这个函数将返回非静态类或接口实例方法的方法 ID。这个方法可以是某个clazz 的超类中定义,也可从clazz 继承,最后一个参数为签名,最后两个参数是const char*类型,是utf8类型。需要注意的是Android123提醒大家执行GetMethodID()函数将导致未初始化的类初始化,如果要获得构造函数的方法ID,使用 作为方法名,同时将 void (V) 作为返回类型,如果找不到指定的ID将返回NULL,同时异常可能有:

(1 NoSuchMethodError 找不到指定的Java方法。
(2 ExceptionInInitializerError 如果由于异常而导致类初始化程序失败
(3 OutOfMemoryError 内存不足

2 . NativeType CallXXXMethod (JNIEnv *env, jobject obj,jmethodID methodID, va_list args); 调用XXX类型的Java方法

执行Java类中某个方法,需要注意的是这个里的java类是非静态的,由于Java的方法的类型比较多,所以该函数可能有以下几种形式,如 CallObjectMethod,CallBooleanMethod,CallByteMethod,CallCharMethod,CallShortMethod,CallIntMethod,CallLongMethod,CallFloatMethod,CallDoubleMethod 和CallVoidMethod,需要注意的是,该函数的第三个参数为通过GetMethodID函数获取的方法ID,最后一个参数为这个方法的参数表,最后的va_list宏可以通过搜索获取具体的使用方法,这里Android开发网不再赘述。

3.NativeType CallNonvirtualXXXMethod (JNIEnv *env, jobject obj,jclass clazz, jmethodID methodID, jvalue *args);

CallNonvirtualXXXMethod函数和上面的CallXXXMethod 不同之处是多了一个jclass参数,CallXXXMethod是根据对象来调用方法,而CallNonvirtualXXXMethod是根据类的实例调用,区别在这点。

上面的三个均为非静态类的获取,执行调用,需要实例化这个类才可以执行,下面的为静态调用。

4. jmethodID GetStaticMethodID(JNIEnv *env, jclass clazz,const char *name, const char *sig);

5. NativeType CallStaticXXXMethod(JNIEnv *env, jclass clazz,jmethodID methodID, …);
三、访问Java对象的域

Java对象的域或者说字段、属性(Field) 类似方法的执行

1. jfieldID GetFieldID(JNIEnv *env, jclass clazz,const char *name, const char *sig); 获取实例对象的域ID

需要注意的是,非静态的实例化后的对象,可能产生的异常有

(1 NoSuchFieldError 找不到指定的域
(2 ExceptionInInitializerError 因为异常而导致类初始化失败
(3 OutOfMemoryError内存不足。

2. NativeType GetXXXField(JNIEnv *env, jobject obj,jfieldID fieldID);

类似GetXXXMethod函数,可能有的类型有 GetObjectField,GetBooleanField,GetByteField,GetCharField,GetShortField,GetIntField,GetLongField,GetFloatField,GetDoubleField。

3. void SetXXXField(JNIEnv *env, jobject obj, jfieldID fieldID,NativeType value);

Java 的域可以赋值的,可能有的类型有 SetObjectField,SetBooleanField,SetByteField,SetCharField,SetShortField,SetIntField,SetLongField,SetFloatField,SetDoubleField。

上面3种情况均为非静态对象的域,对于不需要实例化对象的域,可以直接使用下面的。

4. jfieldID GetStaticFieldID(JNIEnv *env, jclass clazz,const char *name, const char *sig);

5. NativeType GetStaticXXXField(JNIEnv *env, jclass clazz,jfieldID fieldID);

6. void SetStaticXXXField(JNIEnv *env, jclass clazz,jfieldID fieldID, NativeType value);
分享到:
评论

相关推荐

    android jni获取 Mac地址

    在Android开发中,JNI(Java Native Interface)是一种技术,允许Java代码和其他语言写的代码进行交互。当需要执行一些性能敏感或者Java无法直接处理的任务时,开发者通常会利用JNI调用C/C++原生代码。本话题关注的...

    android jni 加密demo

    在这个"android jni 加密demo"中,开发者使用JNI来实现多种加密算法,包括RSA、3DES、AES、MD5以及BASE64,这些都是信息安全领域常用的加密和哈希方法。以下是对这些技术的详细解释: 1. **RSA**:RSA是一种非对称...

    Android JNI demo

    2. 编译JNI头文件:使用`javah`命令(在Android Studio中通常是自动完成的)生成JNI头文件,这个文件包含了Java本地方法的C/C++原型。例如,`JniDemo.h`。 3. 实现本地方法:在C/C++源文件(如`JniDemo.cpp`)中,...

    serial_jni_largestgle_Androidjni_Android串口操作JNI代码_android_

    `serial_jni_largestgle_Androidjni_Android串口操作JNI代码_android_`这个项目就是关于如何使用JNI来实现Android设备的串口读写的示例。 首先,我们需要了解JNI的概念。JNI是Java平台提供的一种接口,允许Java代码...

    Android JNI多线程编程回调JAVA函数

    本话题将深入探讨如何在Android中使用JNI进行多线程编程,并实现native方法对Java函数的回调。 1. **JNI基础知识**: - JNI是Java平台的一部分,为Java应用程序提供了与本地代码交互的能力。开发者可以通过JNI在...

    android jni调用demo

    本项目“android jni调用demo”包含了一个完整的示例,从Java代码的`native`方法声明,到C/C++的实现,再到构建和运行。通过分析这个项目,开发者可以了解如何在实际项目中使用JNI,以及如何在Android Studio中集成...

    android jni开发步骤

    Android JNI(Java Native Interface)开发是将C/C++代码集成到Android应用中的技术,它允许开发者利用原生代码实现特定的高性能或低级操作。JNI在Android开发中扮演着重要角色,尤其对于处理图形计算、游戏引擎、底层...

    Android JNI使用demo

    通过这个"Android JNI使用demo",开发者可以学习到如何在Android应用中创建、调用和管理本地方法,理解JNI的工作原理,从而更好地利用C/C++进行性能优化和功能扩展。随着对JNI的深入理解和实践,开发者可以构建出更...

    android jni 屏幕截图 NativeScreenCapture

    JNI包括一系列的函数调用,如`JNIEnv`指针,用于在Java和本地代码之间传递参数、调用Java方法等。 2. **屏幕截图原理**:Android系统的屏幕截图通常涉及获取显示服务器的缓冲区数据。在JNI中,我们需要通过系统服务...

    android jni实用demo

    Android JNI(Java Native Interface)是Android系统中连接Java层与C/C++原生代码的关键技术。这个"android jni实用demo"提供了一个很好的学习平台,帮助开发者深入理解如何在Android应用中使用JNI进行跨语言编程。 ...

    Android JNI串口通讯【实战例子】

    Android JNI串口通讯【实战例子】 学习NDK开发很好的例子,也可以直接用在项目中

    Android中JNI实现AES加密源代码

    在Android开发中,JNI(Java Native Interface)是一个关键的技术,它允许Java代码和其他语言写的代码进行交互。JNI常用于提高应用程序性能,访问特定硬件功能,或者像本例中所示,执行安全操作,如AES加密。AES...

    android jni使用方法

    以下是对Android JNI使用方法的详细步骤和解释: 1. **创建Android项目**: 首先,你需要在Android Studio中创建一个新的Android项目。在这个例子中,项目名为`jniceshi2`。 2. **编写Java类并生成.class文件**:...

    android jni调用jni 方法

    本篇文章将深入探讨如何在Android中使用JNI以及如何在JNI层调用方法。 1. **JNI基本概念** - JNI是一种接口,让Java应用程序能够调用本地(非Java)代码,同时也允许本地代码调用Java方法。 - 在Android中,JNI...

    android jni使用curl进行http请求和文件下载

    在Android开发中,JNI(Java Native Interface)是一种技术,允许Java代码和其他编程语言(如C++)进行交互。JNI在很多场景下都很有用,比如优化性能、调用系统底层库或者像本例中那样,利用C/C++库来实现特定功能。...

    android JNI学习三实例

    Android JNI(Java Native Interface)是Android平台上的一个关键特性,它允许Java代码和其他语言写的代码进行交互,通常用于提升性能、调用系统底层库或利用C/C++的库。在这个"android JNI学习三实例"中,我们将...

    Android JNI 用C函数写本地库读写文件,底层调用小例子

    在Android中,使用JNI的第一步是创建一个本地方法声明。在Java代码中,我们需要定义一个native方法,并使用`System.loadLibrary()`加载对应的本地库。例如: ```java public class JniExample { static { System....

    android jni 里面使用NewGlobalRef

    在Android的JNI(Java Native Interface)开发中,`NewGlobalRef`是一个至关重要的函数,它允许我们在本地C/C++代码中创建对Java对象的全局引用。这个知识点涉及到Android应用的跨语言交互,内存管理和生命周期管理。 ...

    android jni接口方法

    android jni接口方法调用 以及hal层封装接口定义

Global site tag (gtag.js) - Google Analytics