JNI訪問Java中各方法
阿新 • • 發佈:2018-11-16
#include <stdio.h> #include "com_ican_twy_JniTest.h" #include <Windows.h> #include <string.h> //訪問非靜態方法 JNIEXPORT void JNICALL Java_com_ican_twy_JniTest_accessMethod (JNIEnv * env, jobject jobj) { jclass jclaz = (*env)->GetObjectClass(env, jobj); //方法的名字,方法的簽名 jmethodID mid = (*env)->GetMethodID(env, jclaz, "getRandomInt", "(I)I"); //呼叫 jint random = (*env)->CallIntMethod(env, jobj, mid, 200); printf("c random %d \n", random); } //JNI 訪問Java 中的靜態方法 JNIEXPORT void JNICALL Java_com_ican_twy_JniTest_accessStaticMethod (JNIEnv * env, jobject jobj) { //jclass, 通過jobjcct 來搜尋class,如果找到了,將這個class 轉變成jclass,然後返回。 jclass jc = (*env)->GetObjectClass(env, jobj); //jmethdId,GETStaticMethodID 方法的名字,方法的簽名 jmethodID jmid = (*env)->GetStaticMethodID(env, jc, "getRandeomUUId", "()Ljava/lang/String;"); // 呼叫靜態方法 jstring jstr = (*env)->CallStaticObjectMethod(env, jc, jmid); //jstring -> char * char * uuid_c = (*env)->GetStringUTFChars(env, jstr, NULL); char filename[100]; sprintf(filename, "D://%s.txt", uuid_c); FILE *fp = fopen(filename, "w"); fputs("I love Av", fp); fclose(fp); printf("檔案寫入成功\n"); } //訪問java構造方法 JNIEXPORT jobject JNICALL Java_com_ican_twy_JniTest_accessConstructor (JNIEnv * env, jobject jobj) { //通過類的路徑來從JVM 裡面找到對應的類 jclass jc = (*env)->FindClass(env, "java/util/Date"); jmethodID jmid = (*env)->GetMethodID(env, jc, "<init>", "()V"); //呼叫 newObject 例項化Date 物件,返回值是一個jobjcct jobject date_obj = (*env)->NewObject(env, jc,jmid); //得到對應物件的方法,前提是,我們訪問了相關物件的建構函式建立了這個物件 jmethodID time_mid = (*env)->GetMethodID(env, jc, "getTime", "()J"); jlong time = (*env)->CallLongMethod(env, date_obj, time_mid); printf("time:%lld \n", time); return date_obj; } JNIEXPORT jstring JNICALL Java_com_ican_twy_JniTest_chineseChars (JNIEnv * env, jobject jobj, jstring in) { //jboolean iscp; //char * c_str = (*env)->GetStringChars(env, in, &iscp); //if (iscp == JNI_TRUE) //{ // printf("is copy: JNI_TRUE\n"); //} //else if (iscp == JNI_FALSE) //{ // printf("is copy: JNI_FALSE\n"); //} //int length = (*env)->GetStringLength(env, in); //const jchar * jcstr = (*env)->GetStringChars(env, in, NULL); ////jchar -> char //char * rtn = (char *)malloc(sizeof(char) * 2 * length + 3); //memset(rtn, 0, sizeof(char) * 2 * length + 3); //int size = 0; //size = WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)jcstr, length, rtn, sizeof(char) * 2 * length + 3, NULL, NULL); //printf("string: %s\n", rtn);//string 寶寶 //if (iscp) { // (*env)->ReleaseStringChars(env, in, c_str);// JVM 使用。通知JVM c_str 所指的空間可以釋放了 //} //return NULL; char *c_str = "馬蓉與寶寶"; jclass str_cls = (*env)->FindClass(env, "java/lang/String"); jmethodID jmid = (*env)->GetMethodID(env, str_cls, "<init>", "([BLjava/lang/String;)V"); //jstring -> jbyteArray jbyteArray bytes = (*env)->NewByteArray(env, strlen(c_str)); // 將Char * 賦值到 bytes (*env)->SetByteArrayRegion(env, bytes, 0, strlen(c_str), c_str); jstring charsetName = (*env)->NewStringUTF(env, "GB2312"); return (*env)->NewObject(env, str_cls, jmid, bytes, charsetName); }