Android JNI和NDK学习(06)--JNI的数据类型(转)

本文转自:http://www.cnblogs.com/skywang12345/archive/2013/05/23/3094037.html

本文介绍JNI的数据类型。NDK中关于JNI数据类型的定义都在jni.h中,大家可以参考jni.h。jni.h在ndk中的路径参考:

android-ndk-r7b/platforms/android-14/arch-arm/usr/include/jni.h

1 基本数据类型

为了使用方便,JNI还提供了以下定义:

#define JNI_FALSE 0
#define JNI_TRUE  1

typedef jint jsize;

2 引用类型

3 数组类型

4 Java虚拟机类型

将JNI注册到Java时,会首先注册到Java虚拟机。Java虚拟机的类型如下表:

 

说明:

(01) L fully-qualified-call; 

示例:"Ljava/lang/String;",它在Java虚拟机中表示“Java中的java.lang.String”对应的类型。

注意:fully-qualified-call必须对应完整的java路径,且用“/”分格。

(02) [ type

示例:"[I",表示int[]类型的数组。

(03) (arg-types) return-type

示例:"(Ljava/lang/String;)I",表示参数是string类型,返回值是int类型。

 

理解上面这些基本类型之后,我们再来介绍“JNINativeMethod 结构体”。这是JNI编程中非常重要的一个结构体!

5 JNINativeMethod 结构体

5.1 JNINativeMethod定义

typedef struct {  

    const char* name; 
    const char* signature; 
    void* fnPtr; 
} JNINativeMethod;

name:Java中函数的名字。
signature:Java中函数的参数和返回值。一般的形式是"(arg-types)return-type":arg-types对应是参数类型,空白表示没有参数;return-type是返回值类型,不能是空白,若返回void,则应该设置return-type为V。
fnPtr:指向native函数的函数名称。前面都要接 (void *)

5.2 JNINativiMethod的示例

// Java和JNI函数的绑定表
static JNINativeMethod method_table[] = {
    { "stringFromJni"   , "()Ljava/lang/String;"  , (void*)stringFromJni  },
    { "stringToJni"     , "(Ljava/lang/String;)V" , (void*)stringToJni    },
};

stringFromJni、stringToJni在Java和JNI中的声明分明如下:

复制代码
// stringToJni对应在Java中的声明
private native String stringFromJni();
// stringToJni对应在JNI中的声明
JNIEXPORT jstring JNICALL stringFromJni(JNIEnv *env, jobject clazz);

// stringToJni对应在Java中的声明
private native void stringToJni(String val);
// stringToJni对应在JNI中的声明
JNIEXPORT void JNICALL stringToJni(JNIEnv *env, jobject clazz, jstring val);
复制代码

 



如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利。
posted @   夜行过客  阅读(323)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
点击右上角即可分享
微信分享提示