1、一个JNI代码示例
首先,我们来看一个比较完整的jni代码示例,这段代码在前面的一篇文章中也有提到过,我们再次以他为例说明JNI中的数据类型:
#include <string.h>
#include <jni.h>
// 这里表示返回的是字符串类型
jstring
// Java中的包名/Java中的类名/Java调用的方法名/参数列表
Java_com_example_testjni_MainActivity_stringFromJNI( JNIEnv* env,
jobject thiz ){
// 下面是一段比较简洁的,对自身系统判断,出于哪一种架构模式
// 主要有x86和arm架构
#if defined(__arm__)
#if defined(__ARM_ARCH_7A__)
#if defined(__ARM_NEON__)
#define ABI "armeabi-v7a/NEON"
#else
#define ABI "armeabi-v7a"
#endif
#else
#define ABI "armeabi"
#endif
#elif defined(__i386__)
#define ABI "x86"
#elif defined(__mips__)
#define ABI "mips"
#else
#define ABI "unknown"
#endif
// 返回一个字符串
return (*env)->NewStringUTF(env, "Hello from JNI ! Compiled with ABI " ABI ".");
}
上面这段代码的意思是,获取手机当前平台的版本,主要有四个版本可以选择,armeabi-v7,armeabi,x86,mips等。
2、基本数据类型
JNI中的数据类型也主要分为两种:基本数据类型与引用数据类型,如下面的两幅图所示。
2.1 基本数据类型
2.2 引用数据类型
2.3 特殊宏定义
在JNI中,C代码部分是符合C语言规范的,可以使用宏定义定义常量,例如:
#define JNI_OK (0) /* no error */
#define JNI_ERR (-1) /* generic error */
#define JNI_EDETACHED (-2) /* thread detached from the VM */
#define JNI_EVERSION (-3) /* JNI version error */
不明白宏定义的同学,应该去翻翻C语言的书。
3、特殊情况
在C中,所有其它JNI引用类型,都被定义为与jobject一样。例如:
typeof jobject jclass;
在C++中,提供了虚构类,加强子类的关系。
class _jobject {};
class _jobject : public _jobject{};
typeof _jobject *jobject;
typeof _jobject *jclass;