android jni与kotlin互调

1.调用的流程

2.开发流程

c/c++文件 java与jni互调例子
#include <jni.h>
#include <android/log.h>
#include <stdio.h>
#include <stdlib.h>
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, "<init>", "()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 %s\n",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基础 - 简书

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值