c改java_Android NDK开发:C修改Java的属性
目錄
C修改Java非靜態屬性
Java代碼
public class JniDemo {
private String name = "迪迦";
static {
System.load("D:\\Project\\VS\\C訪問Java屬性\\x64\\Release\\C訪問Java屬性.dll");
}
public static void main(String[] args){
JniDemo jniDemo = new JniDemo();
System.out.println(jniDemo.name);
jniDemo.changeName();
System.out.println(jniDemo.name);
}
public native void changeName();
}
C代碼(這里的邏輯需要倒著想,先調用修改屬性的方法然后創建需要的參數),這里Jni修改屬性跟Java中的反射差不多
//修改非靜態屬性
JNIEXPORT void JNICALL Java_JniDemo_changeName
(JNIEnv* env, jobject jobj) {
/*
3.創建 clazz
此方法需要的參數為 (JNIEnv *env, jobject obj);
其中各個參數的含義為:
env:C與Java交互的橋梁
obj:Java中的對象
*/
jclass clazz = (*env)->GetObjectClass(env,jobj);
/*
2.創建 fieldID
此方法需要的參數為 (JNIEnv *env, jclass clazz, const char *name, const char *sig);
其中各個參數的含義為:
env:C與Java交互的橋梁
name:屬性的名字
sig:屬性的簽名
(需要創建的變量有:clazz ,name,sig)
*/
char* name = "name";
char* sig = "Ljava/lang/String;";
jfieldID fieldID = (*env)->GetFieldID(env,clazz, name, sig);
/*
1.設置屬性的值
此方法需要的參數為 (JNIEnv *env, jobject obj, jfieldID fieldID, jobject val);
其中各個參數的含義為:
env:C與Java交互的橋梁
fieldID:屬性的id
val:要設置的值
(需要創建的變量有:fieldID ,val)
*/
jstring val = (*env)->NewStringUTF(env,"Jack");
(*env)->SetObjectField(env,jobj, fieldID,val);
}
C修改Java靜態屬性
Java代碼
public class JniDemo {
private static int age = 10;
static {
System.load("D:\\Project\\VS\\C訪問Java屬性\\x64\\Release\\C訪問Java屬性.dll");
}
public static void main(String[] args){
System.out.println(JniDemo.age);
changeStaticAge();
System.out.println(JniDemo.age);
}
public static native void changeStaticAge();
}
C代碼
//修改靜態屬性
JNIEXPORT void JNICALL Java_JniDemo_changeStaticAge
(JNIEnv* env, jclass clazz){
/*
2.創建 fieldID
此方法需要的參數為 (JNIEnv *env, jclass clazz, const char *name, const char *sig);
其中各個參數的含義為:
env:C與Java交互的橋梁
name:屬性的名字
sig:屬性的簽名
(需要創建的變量有:clazz ,name,sig)
*/
char* name = "age";
char* sig = "I";
jfieldID fieldID = (*env)->GetStaticFieldID(env, clazz, name, sig);
/*
1.設置屬性的值
此方法需要的參數為 (JNIEnv *env, jclass clazz, jfieldID fieldID, jint value);
其中各個參數的含義為:
env:C與Java交互的橋梁
clazz:Java字節碼對象
fieldID:屬性的id
value:要設置的值
(需要創建的變量有:fieldID ,value)
*/
jint value = 20;
(*env)->SetStaticIntField(env,clazz,fieldID, value);
}
獲取Java屬性和方法的簽名
獲取Java類中的方法和屬性的簽名使用的是javap命令
javap -p -s 全類名
我這沒有創建包所以直接使用的類名,方法與屬性的簽名就是descriptor對應的值
相關文章
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的c改java_Android NDK开发:C修改Java的属性的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java获取方法上的注解_Spring:
- 下一篇: java格式化星期_在Java中使用Si