初识JNI+NDK

1.什么是JNI,什么是NDK。

jni的全称是java native interface (java本地接口),它是一个标准,是C/C++ 和 java 通信的一个桥梁,ndk它是一个配合jni的开发工具包。

2.JNI的优缺点

优点:运算效率高,安全性高(C/C++的代码不容易被反编译),可以运用大量优秀的C/C++语言库

缺点:对开发人员的要求高,在一定程度上限制了java的跨平台能力,JNI虽然依附于JVM但是有一部分是脱离JVM运行的。

3.JNI中方法格式

Java_com_liyahong_jni_1first_MainActivity_stringFromJNI(JNIEnv *env, jobject jobj)

由上面的例子可以看出,其固定格式为:

Java_包名_类名_方法名(JNIENV* env, jobject jobj)

4.不同情况下的native函数,对jobject的定义

1) 当native函数不是静态的时候,jobject对应的是java中调用该函数的对象(也就是this)

2) 当native函数是静态的时候, jobject对应的是调用此函数的class对象(类对象)

5.JNI的基本数据类型和引用类型

c数据类型   JNI数据类型           解释

uint8_t        jboolean;       /* unsigned 8 bits */

int8_t          jbyte;             /* signed 8 bits */

uint16_t      jchar;             /* unsigned 16 bits */

int16_t        jshort;            /* signed 16 bits */

int32_t        jint;                /* signed 32 bits */

int64_t        jlong;             /* signed 64 bits */

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

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

                  jobject            任何java对象包括没有对应类的java对象

                  jclass               java中的class对象

                  jstring             字符串类对象

                  jarray              对应任何类型的数组

_jobjectArray *                  jobjectArray;

_jbooleanArray *               jbooleanArra

_jbyteArray *                     jbyteArray;

_jcharArray *                     jcharArray;

_jshortArray *                    jshortArray;

_jintArray *                        jintArray;

_jlongArray *                     jlongArray;

_jfloatArray *                     jfloatArray;

_jdoubleArray *                 jdoubleArray;

_jthrowable *                     jthrowable;

_jobject *                           jweak;

6.JNI中java类型的签名对照表

java类型               签名

boolean                Z

byte                      B

char                      C

short                     S

int                          I

long                       J

float                       F

double                   D

void                        V

object                     L完整的类名;        例如 Ljava/lang/String;

array                       [数组的数据类型      例如:int[]  [I  double[][]   [[D

method                  (参数类型)返回值类型   例如:int getNumber(int a, int b) -> (II)I


我们了解完JNI基础之后,下一篇将学习通过JNI调用java的方法和属性以及javap的使用:传送门

猜你喜欢

转载自blog.csdn.net/lyh1299259684/article/details/79430413
今日推荐