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);
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值