jni 中簡單用法
阿新 • • 發佈:2018-12-09
java 呼叫c ,c回撥java
#include <stdio.h>
#include <android/log.h>
#include <string.h>
#include <stdlib.h>
#include <jni.h>
JNIEXPORT jstring JNICALL Java_com_example_bluetooth_JniTest_helloJNI
(JNIEnv *env, jclass jclazz){
// C 裡面的字串表示
char* c = "i from c";
//獲取jclazz 所對應的物件
jobject obj = (*env)->AllocObject(env,jclazz);
//獲取hehe方法的方法ID,第三個引數是方法名,第四個引數是方法簽名
jmethodID method = (*env)->GetMethodID(env,jclazz,"hehe","(Ljava/lang/String;)V");
// void (*CallVoidMethod)(JNIEnv*, jobject, jmethodID, ...);
// jstring (*NewStringUTF)(JNIEnv*, const char*);
// 呼叫hehe方法,最後一個引數是hehe方法所需要的引數,為String型別,
// (*env)->NewStringUTF(env,"heheheheheheheheh")這個是把C String轉成javaString
(*env)->CallVoidMethod(env,obj,method,(*env)->NewStringUTF(env,"heheheheheheheheh"));
return (*env)->NewStringUTF(env, c);
}
JNIEXPORT jlong JNICALL Java_com_example_bluetooth_JniTest_getDate
(JNIEnv *env, jobject obj){
// 建立Date的class的位元組碼物件
jclass clazz = (*env)->FindClass(env,"java/util/Date");
//AllocObject分配新的java物件,而不呼叫其物件的任何構造方法,返回該物件的引用
// jobject data_obj = (*env)->AllocObject(env,clazz);
//得到構造方法
jmethodID constructor_mid = (*env)->GetMethodID(env,clazz,"<init>","()V");
//通過NewObject 得到新的java物件
jobject date_obj = (*env)->NewObject(env,clazz,constructor_mid);
jmethodID method = (*env)->GetMethodID(env,clazz,"getTime","()J");
jlong time = (*env)->CallLongMethod(env,date_obj,method);
printf("當前時間戳:%lld\n",time);
//__android_log_print(ANDROID_LOG_VERBOSE,"lgj","%lld",time);
//獲取當前類的jclass檔案
jclass obj_class = (*env)->GetObjectClass(env,obj);
//獲取Jnitest 的屬性 human
jfieldID field = (*env)->GetFieldID(env,obj_class,"human","Lcom/example/bluetooth/Human;");
//獲取human物件
jobject human_obj = (*env)->GetObjectField(env,obj,field);
jclass human_cls = (*env)->FindClass(env,"com/example/bluetooth/Human");
jmethodID human_method = (*env)->GetMethodID(env,human_cls,"sayHi","()V");
//(*env)->CallVoidMethod(env,human_obj,human_method);呼叫父類的方法
(*env)->CallNonvirtualVoidMethod(env,human_obj,human_cls,human_method);
return time;
}
JNIEXPORT jstring JNICALL Java_com_example_bluetooth_JniTest_chineseChar(JNIEnv *env, jobject obj, jstring str){
char* c_str = (*env)->GetStringUTFChars(env,str,JNI_FALSE);
//__android_log_print(ANDROID_LOG_VERBOSE,"lgj","%s",c_str);
char* c = "李國菁";
jstring ctr = (*env)->NewStringUTF(env,c);
return ctr;
};
int compare(int* a,int* b){
return *a - *b;
}
//C 中排序
JNIEXPORT void JNICALL Java_com_example_bluetooth_JniTest_giveArray
(JNIEnv *env, jobject obj, jintArray arr){
// extern void qsort(void *, size_t, size_t, int (*)(const void *, const void *));
//通過jintarray得到int指標 jint* (*GetIntArrayElements)(JNIEnv*, jintArray, jboolean*);
jint* arr_p = (*env)->GetIntArrayElements(env,arr,NULL);//int陣列型別的指標
//陣列長度
jint arr_length = (*env)->GetArrayLength(env,arr);
//排序
qsort(arr_p,arr_length, sizeof(jint),compare);
//同步java和c 陣列 void (*ReleaseIntArrayElements)(JNIEnv*, jintArray,jint*, jint)
(*env)->ReleaseIntArrayElements(env,arr,arr_p,0);
};