jni基础

每个native函数,都至少有两个参数(JNIEnv*,jclass或者jobject)
1)当native方法为静态方法时:
jclass 代表native方法所属类的class对象(JniTest.class)
2)当native方法为非静态方法时:
object 代表native方法所属的对象


1.基本数据

Java基本数据类型与JNI数据类型的映射关系
Java类型->JNI类型->C类型

boolean   jboolean
byte   jbyte;
char   jchar;
short   jshort;
int   jint;
long   jlong;
float   jfloat;
double   jdouble;
void   void

//引用类型(对象)
String jstring
object jobject
//数组,基本数据类型的数组
byte[] jByteArray
//对象数组
object[](String[]) jobjectArray
2.常用JNIEnv方法
// 获取对应的Jclass对象
jclass cls = (*env)->GetObjectClass(env, jobj);

// 获取对应的Jclass里面的属性id
jfieldID fid = (*env)->GetFieldID(env, cls, "stringname", "Ljava/lang/String;");    

//jstring -> c字符串
//isCopy 是否复制(true代表赋值,false不复制)
char *c_str = (*env)->GetStringUTFChars(env,jstr,JNI_FALSE);

//c字符串 ->jstring
jstring new_jstr = (*env)->NewStringUTF(env, text);

//SetField
(*env)->SetObjectField(env, jobj, fid, "object");

// 获取对应的Jclass里面的静态属性id
jfieldID fid = (*env)->GetStaticFieldID(env, cls, "count", "I");

//GetStaticField
jint count = (*env)->GetStaticIntField(env, cls, fid);

//SetStaticField
(*env)->SetStaticIntField(env,cls,fid,count);

//jmethodID
jmethodID mid = (*env)->GetMethodID(env, cls, "methodName", "(I)I");

//CallMethod
jint random = (*env)->CallIntMethod(env, jobj, mid, "argument");

//jmethodID 
jmethodID mid = (*env)->GetStaticMethodID(env, cls, "getUUID", "()Ljava/lang/String;");// ()表示参数的签名类型,此处无,但也要写出来

//CallStaticMethod
jstring uuid = (*env)->CallStaticObjectMethod(env, cls, mid);

jni基础_第1张图片
Java属性与方法签名列表.png

你可能感兴趣的:(jni基础)