IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> android jni与kotlin互调 -> 正文阅读

[移动开发]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基础 - 简书

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-01-03 16:13:34  更:2022-01-03 16:14:46 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 9:42:47-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码