1. 程式人生 > >jni 中簡單用法

jni 中簡單用法

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