C_day06 c訪問java屬性和方法

#define _CRT_SECURE_NO_WARNINGS
#include "com_dongnaoedu_jni_JniTest.h"
#include <string.h>
//#include <Windows.h>


//函數實現
JNIEXPORT jstring JNICALL Java_com_dongnaoedu_jni_JniTest_getStringFromC
(JNIEnv *env, jclass jcls){
//WinExec("C:\\Program Files (x86)\\Tencent\\QQ\\Bin\\QQScLauncher.exe",0);


//JNIEnv 結構體指針
//env二級指針
//代表Java運行環境,調用Java中的代碼
//簡單的實現
//將C的字符串轉爲一個java字符串
return (*env)->NewStringUTF(env,"C String");
}


JNIEXPORT jstring JNICALL Java_com_dongnaoedu_jni_JniTest_getString2FromC
(JNIEnv *env, jobject jobj, jint num){
return (*env)->NewStringUTF(env,"C String2");
}


//每個native函數,都至少有兩個參數(JNIEnv*,jclass或者jobject)
//1)當native方法爲靜態方法時:
//jclass 代表native方法所屬類的class對象(JniTest.class)
//2)當native方法爲非靜態方法時:
//jobject 代表native方法所屬的對象


//基本數據
//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


//C/C++訪問Java的成員

//查看簽名  將java源文件編譯成.class文件  在class字節碼文件所在目錄下 使用命令 javap  -s -p   加類名就可以查看 

eg :       java -s -p Person              java源碼中的查看方式 在 user\Administrator 下執行eg : javap -s -p   java.util.Date

java -s -p  java.lang.String


//1.訪問屬性
//修改屬性key
JNIEXPORT jstring JNICALL Java_com_dongnaoedu_jni_JniTest_accessField
(JNIEnv *env, jobject jobj){
//jobj是t對象,JniTest.class
jclass cls = (*env)->GetObjectClass(env, jobj);
//jfieldID
//屬性名稱,屬性簽名
jfieldID fid = (*env)->GetFieldID(env, cls, "key", "Ljava/lang/String;");


//jason >> super jason
//獲取key屬性的值
//Get<Type>Field
jstring jstr = (*env)->GetObjectField(env, jobj, fid);
printf("jstr:%#x\n",&jstr);


//jstring -> c字符串
//isCopy 是否複製(true代表賦值,false不復制)
char *c_str = (*env)->GetStringUTFChars(env,jstr,JNI_FALSE);
//拼接得到新的字符串
char text[20] = "super ";
strcat(text,c_str);


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


//修改key
//Set<Type>Field
(*env)->SetObjectField(env, jobj, fid, new_jstr);


printf("new_jstr:%#x\n", &new_jstr);


return new_jstr;
}


//訪問靜態屬性
JNIEXPORT void JNICALL Java_com_dongnaoedu_jni_JniTest_accessStaticField
(JNIEnv *env, jobject jobj){
//jclass
jclass cls = (*env)->GetObjectClass(env, jobj);
//jfieldID
jfieldID fid = (*env)->GetStaticFieldID(env, cls, "count", "I");
//GetStatic<Type>Field
jint count = (*env)->GetStaticIntField(env, cls, fid);
count++;
//修改
//SetStatic<Type>Field
(*env)->SetStaticIntField(env,cls,fid,count);
}


//2.訪問java方法
JNIEXPORT void JNICALL Java_com_dongnaoedu_jni_JniTest_accessMethod
(JNIEnv *env, jobject jobj){
//jclass
jclass cls = (*env)->GetObjectClass(env, jobj);
//jmethodID
jmethodID mid = (*env)->GetMethodID(env, cls, "genRandomInt", "(I)I");
//調用
//Call<Type>Method
jint random = (*env)->CallIntMethod(env, jobj, mid, 200);
printf("random num:%ld",random);


//.....
}


//靜態方法
JNIEXPORT void JNICALL Java_com_dongnaoedu_jni_JniTest_accessStaticMethod
(JNIEnv *env, jobject jobj){
//jclass
jclass cls = (*env)->GetObjectClass(env, jobj);
//jmethodID
jmethodID mid = (*env)->GetStaticMethodID(env, cls, "getUUID", "()Ljava/lang/String;");

//調用
//CallStatic<Type>Method
jstring uuid = (*env)->CallStaticObjectMethod(env, cls, mid);


//隨機文件名稱 uuid.txt
//jstring -> char*
//isCopy JNI_FALSE,代表java和c操作的是同一個字符串
char *uuid_str = (*env)->GetStringUTFChars(env, uuid, JNI_FALSE);
//拼接
char filename[100];
sprintf(filename, "D://%s.txt",uuid_str);
FILE *fp = fopen(filename,"w");
fputs("i love jason", fp);
fclose(fp);
}

發佈了41 篇原創文章 · 獲贊 19 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章