JNI 函数
#include <jni.h>
#include <string>
extern "C" JNIEXPORT jstring JNICALL
Java_com_sample_projectname_MainActivity_stringFromJNI(
JNIEnv* env,
jobject /* this */) {
std::string hello = "Hello from C++";
return env->NewStringUTF(hello.c_str());
}
- 函数名 Java_com_sample_projectname_MainActivity_stringFromJNI,若是静态注册,则命名需要为固定格式,动态注册则不需要,以静态为例
1.Java是函数的前缀
2.com_sample_projectname_MainActivity是函数所在java类路径
3.stringFromJNI是方法名
- 函数返回值
JNIEXPORT和JNICALL宏中间的jstring,表示函数的返回值类型,对应Java的String类型
JNI 数据类型
在调用JNI方法将实参传递给C/C++函数的时候,会自动将java形参的数据类型自动转换成C/C++相应的数据类型,所以我们在写JNI程序的时候,必须要明白它们之间数据类型的对应关系
1.基本数据类型
Java Type |
Native Type |
C/C++ Type |
Description |
boolean |
jboolean |
unsigned char |
unsigned 8 bits |
byte |
jbyte |
signed char |
signed 8 bits |
char |
jchar |
unsigned short |
unsigned 16 bits |
short |
jshort |
signed short |
signed 16 bits |
int |
jint |
signed int |
signed 32 bits |
long |
jlong |
signed long |
signed 64 bits |
float |
jfloat |
float |
32 bits |
double |
jdouble |
double |
64 bits |
2.引用类型
Java Type |
Native type |
all object |
jobject |
java.lang.Class instances |
jstring |
arrays |
jarray |
Object[] |
jobjectArray |
boolean[] |
jbooleanArray |
byte[] |
jbyteArray |
char[] |
jcharArray |
int[] |
jintArray |
long[] |
jlongArray |
float[] |
jfloatAyyay |
double[] |
jdoubleArray |
java.lang.Throwable Objects |
jthrowable |
描述符
- 类描述符用来表示一个类或者接口的名字。
- 把类或者接口在java中所定义的完整名称中的"."替换成"/"就是类描述符,比如:java.lang.String的类描述符为 java/lang/string
3.数组类的描述符:在"["后面跟着数组元素的类型的字段描述符,比如:"int[]"的类描述符为 "[I";"double[][][]"的类描述符为:"[[[D" ,一个 "[" 代表一维
Java Type |
Native type |
boolean |
Z |
byte |
B |
char |
C |
short |
S |
int |
I |
long |
J |
float |
F |
double |
D |
引用类型的字段描述符的第一个字符是"L",接着写类描述符,最后以";"结尾,L 和 ";" 必不可少!数组类型的字段描述符的定义规则和数组类描述符一致
Java Type |
Native type |
String |
"Ljava/lang/String;" |
int[] |
"[I" |
Object[] |
"[Ljava/lang/Object;" |
- 方法描述符
1.首先在"()"中描述参数类型
2.然后在"()"后面描述返回类型
3.参数类型的描述符之间不能有空格或者其他分隔符
4."V"用来表示void
5.构造函数使用"<init>"描述
Java Type |
Native type |
String f(); |
"()Ljava/lang/String;" |
long f(int i, Class c); |
"(ILjava/lang/Class;)J" |
String(byte[] bytes); |
"([B)V" |
函数理解
- 函数参数 (JNIEnv* env, jobject /* this /)
1.参数 JNIEnv env:JNI 所有的接口函数都是通过这个指针调用的。
2.参数 object:如果 Java 中此方法是实例方法,那么这边就是 Java 实例,如果是类方法,那么就是 Java 类
- 调用GetStringUTFChars后必须需要调用ReleaseStringUTFChars