Java中调用jni代码
Java代码:
1 |
public native String getString(); |
native关键字指定该方法是native方法
同时在Java代码中调用so库
1 2 3 |
static { System.loadLibrary("hellojni"); } |
jni代码
h头文件中
1 |
#include <jni.h> //引用jni头文件,JNI中定义的宏才能用 |
将方法声明放到extern "C" {}
的方法体内
- 函数名命名规则: Java_包名_类名_方法名, 其中包名中的"."用"_"替换
- JNIEnv* 指向JNI环境的指针, 通过它访问JNI提供的接口方法
- jobject 表示Java对象中的this
cpp文件中
include上面的h文件
JNI调用Java中的代码
先通过类名找到类, 然后根据方法名找到方法的ID, 然后就可以调用了;
以静态方法为例, 非静态需先构造类对象
- 找类:
jclass jclass1=env->FindClass("类的签名");
- 找方法:
jmethodID jmethodID1=env->GetStaticMethodID(jclass1,"方法名(Java中的方法名)","方法的签名");
- 调用:
env->CallStaticVoidMethodA(jclass1,jmethodID1,"方法参数");
.h文件
1 2 3 4 5 6 7 8 9 10 |
#include <jni.h> #include <string.h> #include <stdio.h> #ifndef TEXTJNI_ONE_H #define TEXTJNI_ONE_H extern "C" { JNIEXPORT jstring JNICALL Java_com_example_cold_textjni_MainActivity_getString(JNIEnv *env, jobject thiz); }; #endif //TEXTJNI_ONE_H |
.cpp文件
1 2 3 4 5 6 7 8 9 10 11 12 |
#include "One.h" #include <stdio.h> JNIEXPORT jstring JNICALL Java_com_example_cold_textjni_MainActivity_getString(JNIEnv* env,jobject thiz ){ //获取Java类,方法的代码 jclass jclass1=env->FindClass("类的签名"); jmethodID jmethodID1=env->GetStaticMethodID(jclass1,"方法名(Java中的方法名)","方法的签名"); env->CallStaticVoidMethodA(jclass1,jmethodID1,"方法参数"); //返回值 return env->NewStringUTF("I'm comes from to Native Function!"); } |
JNI的数据类型和类型签名
基本数据类型
Java类型 | 本地类型 | 描述 |
---|---|---|
boolean | jboolean | C/C++8位整型 |
byte | jbyte | C/C++带符号的8位整型 |
char | jchar | C/C++无符号的16位整型 |
short | jshort | C/C++带符号的16位整型 |
int | jint | C/C++带符号的32位整型 |
long | jlong | C/C++带符号的64位整型e |
float | jfloat | C/C++32位浮点型 |
double | jdouble | C/C++64位浮点型 |
Object | jobject | 任何Java对象,或者没有对应java类型的对象 |
Class | jclass | Class对象 |
String | jstring | 字符串对象 |
Object[] | jobjectArray | 任何对象的数组 |
boolean[] | jbooleanArray | 布尔型数组 |
byte[] | jbyteArray | 比特型数组 |
char[] | jcharArray | 字符型数组 |
short[] | jshortArray | 短整型数组 |
int[] | jintArray | 整型数组 |
long[] | jlongArray | 长整型数组 |
float[] | jfloatArray | 浮点型数组 |
double[] | jdoubleArray | 双浮点型数组 |
签名
- 类的签名 "L+包名+类名+;", 将'.'替换成'/',例如String的签名就是Ljava/lang/Sring;,';'是存在的.
- 基本数据类型的签名
Java类型 | 签名 |
---|---|
boolean | Z |
byte | B |
char | C |
short | S |
int | I |
long | J |
float | F |
double | D |
void | V |
- 对象的签名
对象的签名就是它所属的类的签名 - 数组的签名
"[+类型签名",int[]的签名为[I
"n个[+类型签名",多维,int[][]的签名为[[I - 方法的签名
"(参数类型签名)+返回值类型签名"
例如:void fun1(int i), 签名为(I)V
0 Comments