/
/
reflect.c
/
/
7.
在native层反射获取并修改java层普通字段的值
JNIEXPORT jstring JNICALL
Java_com_example_ndk_1jin01_MainActivity_field(JNIEnv
*
env, jobject obj){
/
/
反射获取对应的类
jclass clszz
=
(
*
env)
-
>FindClass(env,
"com/example/ndk_jin01/MainActivity"
);
/
/
获取实例字段
ID
jfieldID field_ID
=
(
*
env)
-
>GetFieldID(env,clszz,
"_field"
,
"Ljava/lang/String;"
);
/
/
根据实例字段
ID
获取对应的值
jstring jstr
=
(
*
env)
-
>GetObjectField(env,obj,field_ID);
/
/
将jstring类型转换为char数组
const char
*
chars
=
(
*
env)
-
>GetStringUTFChars(env,jstr,
0
);
syslog(LOG_ERR,
"Before field() changes = %s"
, chars);
/
/
根据实例字段
ID
设置相应的值
jstring
str
=
(
*
env)
-
>NewStringUTF(env,
"hello! _field"
);
(
*
env)
-
>SetObjectField(env,obj,field_ID,
str
);
/
/
根据实例字段
ID
获取对应的值
jstring jstr2
=
(
*
env)
-
>GetObjectField(env,obj,field_ID);
/
/
将jstring类型转换为char数组
const char
*
chars2
=
(
*
env)
-
>GetStringUTFChars(env,jstr2,
0
);
syslog(LOG_ERR,
"After field() changes = %s"
, chars2);
return
jstr2;
}
/
/
8.
在native层反射获取java层普通方法
JNIEXPORT jstring JNICALL
Java_com_example_ndk_1jin01_MainActivity_method(JNIEnv
*
env, jobject obj) {
/
/
反射获取对应的类
jclass clszz
=
(
*
env)
-
>FindClass(env,
"com/example/ndk_jin01/MainActivity"
);
/
/
获取成员方法的
ID
jmethodID method_ID
=
(
*
env)
-
>GetMethodID(env,clszz,
"method_text"
,
"(Ljava/lang/String;C)Ljava/lang/String;"
);
/
/
调用java层方法
jstring
str
=
(
*
env)
-
>NewStringUTF(env,
"method!"
);
jstring jstr
=
(
*
env)
-
>CallObjectMethod(env,obj,method_ID,
str
,
'A'
);
const char
*
chars
=
(
*
env)
-
>GetStringUTFChars(env,jstr,
0
);
syslog(LOG_ERR,
"method() = %s"
, chars);
return
jstr;
}
/
/
9.
在native层反射获取并修改java层静态字段
JNIEXPORT jstring JNICALL
Java_com_example_ndk_1jin01_MainActivity_staticfield(JNIEnv
*
env, jclass clszz){
/
/
获取静态字段
ID
jfieldID field_ID
=
(
*
env)
-
>GetStaticFieldID(env,clszz,
"_staticfield"
,
"Ljava/lang/String;"
);
/
/
根据静态字段
ID
获取该字段的值
jstring jstr
=
(
*
env)
-
>GetStaticObjectField(env,clszz,field_ID);
/
/
将jstring类型转换为char数组
const char
*
chars
=
(
*
env)
-
>GetStringUTFChars(env,jstr,
0
);
syslog(LOG_ERR,
"Before staticfield() changes = %s"
, chars);
/
/
根据静态字段
ID
设置该字段的值
jstring
str
=
(
*
env)
-
>NewStringUTF(env,
"hello static _staticfield!"
);
(
*
env)
-
>SetStaticObjectField(env,clszz,field_ID,
str
);
/
/
根据静态字段
ID
获取该字段的值
jstring jstr2
=
(
*
env)
-
>GetStaticObjectField(env,clszz,field_ID);
/
/
将jstring类型转换为char数组
const char
*
chars2
=
(
*
env)
-
>GetStringUTFChars(env,jstr2,
0
);
syslog(LOG_ERR,
"After staticfield() changes = %s"
, chars2);
return
jstr2;
}
JNIEXPORT jstring JNICALL
Java_com_example_ndk_1jin01_MainActivity_staticfield1(JNIEnv
*
env, jobject obj){
/
/
反射获取对应的类
jclass clszz
=
(
*
env)
-
>FindClass(env,
"com/example/ndk_jin01/MainActivity"
);
/
/
java这如果声明native方法为static,参数已经传入了clazz,可以跳过这步
/
/
获取静态字段
ID
jfieldID field_ID
=
(
*
env)
-
>GetStaticFieldID(env,clszz,
"_staticfield"
,
"Ljava/lang/String;"
);
/
/
jfieldID field_ID
=
(
*
env)
-
>GetFieldID(env,clszz,
"_staticfield"
,
"Ljava/lang/String;"
);
/
/
'_staticfield'
is
a static field
and
should be acquired by
'GetStaticFieldID'
.
/
/
根据静态字段
ID
获取该字段的值
jstring jstr
=
(
*
env)
-
>GetStaticObjectField(env,clszz,field_ID);
/
/
将jstring类型转换为char数组
const char
*
chars
=
(
*
env)
-
>GetStringUTFChars(env,jstr,
0
);
syslog(LOG_ERR,
"Before staticfield1() changes = %s"
, chars);
/
/
根据静态字段
ID
设置该字段的值
jstring
str
=
(
*
env)
-
>NewStringUTF(env,
"hello _staticfield!"
);
(
*
env)
-
>SetStaticObjectField(env,clszz,field_ID,
str
);
/
/
根据静态字段
ID
获取该字段的值
jstring jstr2
=
(
*
env)
-
>GetStaticObjectField(env,clszz,field_ID);
/
/
将jstring类型转换为char数组
const char
*
chars2
=
(
*
env)
-
>GetStringUTFChars(env,jstr2,
0
);
syslog(LOG_ERR,
"After staticfield1() changes = %s"
, chars2);
return
jstr2;
}
/
/
10.
在native层反射获取java层静态方法
JNIEXPORT jstring JNICALL
Java_com_example_ndk_1jin01_MainActivity_staticmethod(JNIEnv
*
env, jclass clszz){
/
/
获取静态方法方法的
ID
jmethodID method_ID
=
(
*
env)
-
>GetStaticMethodID(env,clszz,
"staticmethod_text"
,
"(Ljava/lang/String;D)Ljava/lang/String;"
);
/
/
调用java层方法
jstring
str
=
(
*
env)
-
>NewStringUTF(env,
"staticmethod!"
);
jstring jstr
=
(
*
env)
-
>CallStaticObjectMethod(env,clszz,method_ID,
str
,
3.14
);
const char
*
chars
=
(
*
env)
-
>GetStringUTFChars(env,jstr,
0
);
syslog(LOG_ERR,
"method() = %s"
, chars);
return
jstr;
}
/
/
11.
在native层反射实例化对象返回给java层
JNIEXPORT jobject JNICALL
Java_com_example_ndk_1jin01_MainActivity_ss(JNIEnv
*
env, jclass clazz, jstring data) {
/
/
反射获取对应的类
jclass
cls
=
(
*
env)
-
>FindClass(env,
"com/example/ndk_jin01/SignQuery"
);
/
/
获取类SignQuery的构造函数
ID
jmethodID init
=
(
*
env)
-
>GetMethodID(env,
cls
,
"<init>"
,
"(Ljava/lang/String;Ljava/lang/String;)V"
);
/
/
C语言中的某个功能data数据进行加密,省略
jstring sign
=
(
*
env)
-
>NewStringUTF(env,
"hahahahhaha"
);
/
/
实例化对象 new SignQuery(...) jobject cls_obj
=
(
*
env)
-
>NewObject(env,
cls
, init, sign, data);
syslog(LOG_ERR,
"ss() = %p"
, cls_obj);
return
cls_obj;
/
/
加密后的数据保存到一个对象中返回给java层
}