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);
};