NDK开发学习(二):JNI规则

JVM查找native方法

JVM 查找 native 方法有两种方式:

  • 按照 JNI 规范的命名规则
  • 调用 JNI 提供的 RegisterNatives 函数,将本地函数注册到 JVM 中。

在编译我们所写的c/c++代码成动态库的时候,有两个头文件是需要的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
> jni_md.h
```c++
#ifndef _JAVASOFT_JNI_MD_H_
#define _JAVASOFT_JNI_MD_H_
#define JNIEXPORT __attribute__((visibility("default")))
#define JNIIMPORT __attribute__((visibility("default")))
#define JNICALL
typedef int jint;
#ifdef _LP64 /* 64-bit */
typedef long jlong;
#else
typedef long long jlong;
#endif
typedef signed char jbyte;
#endif /* !_JAVASOFT_JNI_MD_H_ */

当然,可以看到在mac平台下JNIEXPORTJNIIMPORTJNICALL并没有定义具体内容,是个空定义。

至于函数的命名规则,在NDK开发学习(一):尝试JNI中有提到。

JNI数据类型

首先是一个非常特殊的类型——JNIEnv*。它是定义任意 native 函数的第一个参数,指向 JVM 函数表的指针,函数表中的每一个入口指向一个 JNI 函数,每个函数用于访问 JVM 中特定的数据结构。

其余的下面两张图可以概括

NDK开发学习(二):JNI规则_1.png NDK开发学习(二):JNI规则_2.png

值得注意的是JNI中所与Java中的基本数据类型对应的类型的值是可以在程序中直接使用到的,但是引用数据类型则不行。这是由于与基本类型不同,引用类型所传入的是一个指针类型,指向那个对象在JVM内存中的地址。要想从JVM内存中访问到这些数据,就需要通过JNIEnv*来实现。

#####