android jni与kotlin互调

android jni与kotlin互调,第1张

android jni与kotlin互调

1.调用的流程

2.开发流程

c/c++文件 java与jni互调例子
#include 
#include 
#include 
#include 
jint addNumber(JNIEnv *env,jclass clazz,jint a,jint b){
    return a+b;
}
jint subNumber(JNIEnv *env,jclass clazz,jint a,jint b){
    return a-b;
}
jint mulNumber(JNIEnv *env,jclass clazz,jint a,jint b){
    return a*b;
}
jint divNumber(JNIEnv *env,jclass clazz,jint a,jint b){
    return a/b;
}
JNIEXPORT jint JNI_onLoad(JavaVM* vm, void* reserved){
    //1.java调用jni 这里采用动态注册的方式
    __android_log_print(ANDROID_LOG_DEBUG,"JNITag","enter jni_onload");//打印日志
    JNIEnv* env = NULL;
    jint result = -1;
    // 判断是否正确
    if((*vm)->GetEnv(vm,(void**)&env,JNI_VERSION_1_6)!= JNI_OK){
        return result;
    }
    //注册四个方法,注意签名
    const JNINativeMethod method[]={
            {"add","(II)I",(void*)addNumber},
            {"sub","(II)I",(void*)subNumber},
            {"mul","(II)I",(void*)mulNumber},
            {"div","(II)I",(void*)divNumber}
    };
    //找到对应的JNITools类
    jclass jClassName=(*env)->FindClass(env,"com/example/jnidemo/JNITools");
    //开始注册
    jint ret = (*env)->RegisterNatives(env,jClassName,method, 4);
    
    
    //2.jni调用java方法 类似反射
    jmethodID constructor = (*env)->GetMethodID(env, jClassName, "", "()V");
    jobject  obj = (*env)->NewObject(env, jClassName, constructor);
    jmethodID getJavaInfo = (*env)->GetMethodID(env, jClassName, "getJavaInfo","()Ljava/lang/String;");
    if(getJavaInfo == NULL) {
        return (*env)->NewStringUTF(env,"find method error");
    }
    jstring infos = (*env)->CallObjectMethod(env,obj, getJavaInfo);
    const char *resultChar = (*env)->GetStringUTFChars(env, infos, NULL);
    //释放资源
    (*env)->DeleteLocalRef(env, jClassName);
    (*env)->DeleteLocalRef(env, obj);
    (*env)->DeleteLocalRef(env, infos);

    __android_log_print(ANDROID_LOG_INFO,"test","value is %sn",resultChar);
//    %c     一个字符(char)
//    %d    有符号十进制整数(int)
//    %e    浮点数、e-记数法
//                %f     单精度浮点数(默认float)、十进制记数法(%.nf  这里n表示精确到小数位后n位.十进制计数)
//    %i              有符号十进制数(与%d相同)
//    %p      指针
//            %s     对应字符串char*(%S             对应宽字符串WCAHR*(%u      无符号十进制整数(unsigned int)
//    %%     打印一个百分号

     //如果注册失败,打印日志
    if (ret != JNI_OK) {
        __android_log_print(ANDROID_LOG_DEBUG, "JNITag", "jni_register Error");
        return -1;
    }
    return JNI_VERSION_1_6;
}

点击下载 用kotlin方式,动态注册native函数例子

后面再深入学习

 参考:Android JNI(一)——NDK与JNI基础 - 简书

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5694634.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存