您的位置:首页 > 其它

JNI数据类型在C中的映射

2014-10-10 14:31 253 查看

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;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: