24H免费课程咨询  TEL:13401595960   QQ:1870218756  微信:13401595960(李老师)

东方博宜

网站首页 > 软件开发资讯 > 安卓开发

【常州Android开发培训班】Android NDK开发之JNI基础知识

2018-05-22 19:12:30 东方博宜 阅读

JNI层方法命名规范


在java层对应的native方法的声明,test方法是一个本地方法,其参数是字符串类型,返回值是字符串类型。


1

2

3

4

5

6

7

8

package com.kltz88.jnidemo;

public class Test {

    static {

        System.loadLibrary("test");

    }

    public native String test(String name);

}


由android studio自动生成的native层的方法如下。


1

2

3

4

5

6

7

8

9

10

11

12

#include <jni.h>

JNIEXPORT jstring JNICALL

Java_com_kltz88_car_jnidemo_Test_test(JNIEnv *env, jobject instance, jstring name_) {

    const char *name = (*env)-&gt;GetStringUTFChars(env, name_, 0);

    // TODO

    (*env)-&gt;ReleaseStringUTFChars(env, name_, name);

    return (*env)-&gt;NewStringUTF(env, returnValue);

}


函数的命名规则


函数命名规则为:Java_类全路径方法名。如Java_com_kltz88_jnidemo_Test_test,其中Java是函数的前缀,com_kltz88_jnidemo_Test是类名,test是方法名,它们之间用 _(下划线) 连接。


函数参数


JNIEXPORT jstring JNICALL Java_com_kltz88_jnidemo_Test_test(JNIEnv *, jclass, jstring );


- 第一个参数:JNIEnv* 是定义任意native函数的第一个参数(包括调用JNI的RegisterNatives函数注册的函数),指向JVM函数表的指针,函数表中的每一个入口指向一个JNI函数,每个函数用于访问JVM中特定的数据结构。


- 第二个参数:调用java中native方法的实例或Class对象,如果这个native方法是实例方法,则该参数是jobject,如果是静态方法,则是jclass


- 第三个参数:Java对应JNI中的数据类型,Java中String类型对应JNI的jstring 类型。


函数返回值类型


夹在JNIEXPORT和JNICALL宏中间的jstring ,表示函数的返回值类型,对应Java的void类型


JAVA层与JNI层数据类型的对应


下面是一个测试方法


1

public native void test(char c,short s,byte by,int i,long l,float f,double d,boolean b,String str,Object o,Test t,int[] arr);


jni层面生成的函数原型


1

2

3

4

JNIEXPORT void JNICALL

Java_com_kltz88_car_jnidemo_Test_test(JNIEnv *env, jobject instance, jbyte by, jchar c, jshort s, jint i,

                                      jlong l, jfloat f, jdouble d, jboolean b, jstring str_,

                                      jobject o, jobject t, jintArray arr);


我们会发现基本数据类型直接会有一种对应关系




其实只是使用了typedef重新定义了一下


1

2

3

4

5

6

7

8

typedef unsigned char   jboolean;       /* unsigned 8 bits */

typedef signed char     jbyte;          /* signed 8 bits */

typedef unsigned short  jchar;          /* unsigned 16 bits */

typedef short           jshort;         /* signed 16 bits */

typedef int             jint;           /* signed 32 bits */

typedef long long       jlong;          /* signed 64 bits */

typedef float           jfloat;         /* 32-bit IEEE 754 */

typedef double          jdouble;        /* 64-bit IEEE 754 */

常州东方博宜是一家专注IT,互联网,电脑方面的顶尖培训机构,欢迎社会及院校有志互联网营销,搜索引擎营销的人士,来东方博宜报名学习,互相交流。

常州东方博宜地址:常州天宁区延陵西路2号工人文化宫5号楼

 2.新北区太湖东路9-4号常州创意园E12


Powered by 东方博宜教育咨询江苏有限公司  ©2008-2018 www.czos.cn