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);
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章