首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Kotlin Native 写 Jni 第二弹:动态绑定 Native 方法

上一篇文章 我讲了用 @CName 这个神奇注解,可以配置 Kotlin Native 函数在符号表中名字,进而根据 Jni 静态绑定规则来对应到 Java native 方法,但实际开发当中我们更喜欢用动态注册方式...如果大家习惯用 C 写动态绑定代码,那么 Kotlin Native 写起来思路也是很简单,只要依样画葫芦,就可以写出来,我们先给出代码: @CName("JNI_OnLoad") fun JNI_OnLoad...获取 JNIEnv 指针时我们首先构造了一个指针左值类型: val envStorage = alloc>() 这么说有些奇怪,总之在 C 指针类型向...因此理想状况是,我们用 Kotlin Native 对 C 接口进行封装,这些底层工作按照 Kotlin 风格进行转换,这样我们使用起来就会容易得多——官方 AndroidNativeActivity...(envStorage.value, jclass, jniMethod, 1) 这里面也向大家展示了如何 Kotlin 函数转为 C 函数指针,总体来讲思路还是很简单,毕竟我们只是照猫画虎。

1.3K20

Kotlin Native凭什么吸引你

Kotlin for JavaScript 就我们使用体验来看,Kotlin 相比 JavaScript 并没有太大优势,但是由于Kotlin 能够转化为JavaScript,所以它能够在多个平台业务逻辑控制在一套代码内方向上走更远...要做到这点需要完成3个步骤,首先是创建 .def 文件,然后用cinterop 工具生成 bindings,最后编译Kotlin / Native 项目。...指针 在C 语言开发中经常会碰到处理指针操作,Kotlin 也在这方面进行了对应映射。下图就是他们之间映射关系。...Kotlin 也提供了指针转换操作,上图是实践案例。 Strings String 基本上在所有的语言中都是比较特殊类型,在开发过程中C 语言传递字符串,有时传递是char 指针。...Kotlin 中提供了获取这些指针方法,以此来拿到字符串。不仅如此还可以字符串反向转换成对应char 指针

1.4K40
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    深入理解Kotlin Native梦想与可能

    如果读者熟悉 C/C++ 中宽字符 wchar_t 类型,我们可以 Kotlin 字符串转换成 C 语言字符串过程类比成宽字符串(wchar_t *)转换成窄字符串(char *)过程(调用 C...对 owner 进行赋值,在 C 语言看来是另一个 User 实例数据复制过来,而在 Kotlin 看来,这仅仅是 owner 指向对象做修改。...在 C 语言中,我们提到函数类型通常就是指函数指针类型,这主要是因为函数名总是会在表达式中隐式转换为指向自己函数指针。...需要注意是,这个指针指向实际上是 StableRef 背后一个 C++ 对象,因此在 C 函数中,我们不能直接使用这个指针来获取对应 Kotlin 对象,而只能把它当成一个透明指针来使用。...究竟是什么,只需要在调用相应 API 时 fopen 返回 FILE 指针进去即可。

    74611

    干货 | 携程机票 App KMM 跨端生产实践

    Kotlin 依据其运行平台不同拥有不同名字,例如编译为 class 字节码运行于 JVM 及 Android 平台称为 Kotlin/JVM,编译为原生二进制码虚拟机环境直接运行于操作系统上则称为...这里仅列举 iOS 集成过程中若干场景问题: 2.2.1 cinterop 官方提供 cinterop 工具可以指定 C/Objective-C 库所有公开 API 封装转译为 Kotlin...在 iOS 平台如下: actual typealias MMKV = xxx.xxx.ios.MMKV iOS 上没有包名概念,xxx.xxx.ios 是使用 cinterop 等工具生成 Kotlin...我们原有的网络框架做微小改动,提供一个不进行序列化与反序列化选项,框架用户可直接序列化好 request entity 二进制数据传递给框架,而框架也会将反序列化前 response entity...执行异步任务回调中将对象子图重新绑定,最终再使用 GCD 重新切换回主线程后(同样要做对象子图分离与绑定)恢复协程。

    3.4K10

    Android JNI 基础知识

    在声明 native 方法时还是用 Java 来写比较好,比 Kotlin external 关键字要友好多了,可以直接快捷键生成对用 C++ 方法。...JNIEnv 类型对象参数 env JNIEnv* 是定义任意 native 函数第一个参数,它是一个指针,通过它可以访问虚拟机内部各种数据结构,同时它还指向 JVM 函数表指针,函数表中每一个入口指向一个...可以看到这里面涉及了三类指针,JNIEnv * 本身就是指针,而它指向也是指针,在 JVM 函数表里面的每一项又都是指针。...如下表所示: Java 类型 Native 类型 符号属性 字长 boolean jboolean 符号 8位 byte jbyte 符号 8位 char jchar 符号 16位 short jshort.../ ReleaseStringUTFChars 获得或释放一个指向 UTF-8 编码字符串指针(指 C/C++ 字符串) GetStringLength 返回 Unicode 编码字符串长度

    1.5K30

    C语言----深入理解指针(1)

    ,用字符串指针来接收,*p指向就是数组第一个元素 //{//size_t是符号返回值 // size_t count = 0; // while (*p !...//另一种写法 size_t my_strlen(char* p)//传过来是数组名,用字符串指针来接收,*p指向就是数组第一个元素 {//size_t是符号返回值 char* star.../strlen是求字符长度,统计字符串中\0之前字符个数 //函数求字符串长度 //参数s指向字符串不期望被修改 size_t my_strlen(const char*s)//把字符元素地址传过来...// 这意味着函数内部对参数值所做任何修改都不会影响原始变量。 //原始数据不会被修改,值调用通常被认为是安全 //址调用涉及参数内存地址传递给函数。...值调用:实际上是参数值复制到函数内部一个局部变量中,这意味着函数内部对参数值所做任何修改都不会影响原始变量,原始数据不会被修改 址调用:涉及参数内存地址传递给函数,这意味着函数可以直接访问和修改原始变量

    8710

    KMM 求生日记二:KotlinNative 被踩中

    Java 所有类根级父类是 Object,但是在 Kotlin/JVM 中,这两者是统一,也就是说如果一段 Java 代码接收参数类型是 Object,那我们仍然可以任意一个 Kotlin 对象作为参数传入...对象 API,通常左右是来生成一个对象(和 Java 中使用 class 方式相似),那么这样 API 可能对 Kotlin 类不兼容。...如果能证明语言层面上问题,后续 Model 层业务逻辑就可以大规模迁移到 KMM。 后面我们可能会把精力花在研究一下 cinterop 这个工具以及 iOS 构建系统上。...如果能用 cinterop 搞定对已有的 iOS Framework 或 .a 文件依赖,我们可以基于许多已有的 Objective-C 库和 Java 库封装出许多实用 KMM 库,而暂时不必用...上面提到东西够我们做一阵子了,如果再往后,就可以考虑完善一些平台统一上层建筑,例如一些和 UI 生命周期绑定 VM 层框架,像 Jetpack ViewModel 和 LiveData 这种,

    2.5K10

    C++数据类型

    ,结果是初始值对符号类型表示数值总数取模后余数。...当一个算数表达式中既有无符号类型又有带符号类型时,带符号数会自动转化为符号数,结果可能是出乎意料: // 切勿混用带符号类型和符号类型 unsigned u = 10; int i = -42;...引用为对象起了另一个名字,定义引用时程序把引用和它初始值绑定在一起,一旦初始化完成引用一直和它初始值对象绑定在一起。...因为无法令引用重新绑定到另一个对象,因此引用必须初始化 因为引用不是一个对象,所以不能定义引用引用 指针 指针指向(point to)另外一种类型复合类型。 1....实际开发过程中,我们尽量等定义了对象之后再定义指向指针,如果实在不清楚指针应该指向何处,那么将它初始化为nullptr,这样程序就能检测并指导它有没有指向任何具体对象了。

    94020

    指针变量值和

    int *pRes,在函数体中 new了一块内存并赋值 12,内存地址赋值给指针 pRes。...因为引用不是对象,故无引用数组,指向引用指针到引用引用: int& a[5]; // 错误 int&* p; // 错误 int& &r; // 错误 所以修改函数int func...、引用区别和联系 值:实参拷贝传递给形参。...就是把实参赋值给形参,赋值完毕后实参就和形参没有任何联系,对形参修改就不会影响到实参。 地址:把实参地址拷贝传递给形参。就是把实参地址复制给形参。...无论值还是指针,函数都会生成一个临时变量,但引用时,不会生成临时变量, 值时,只可以引用值而不可以改变值,但值引用时,可以改变值, 指针时,只可以改变指针所指内容,不可以改变指针本身,但指针引用时

    2K30

    指针变量值和

    int *pRes,在函数体中 new了一块内存并赋值 12,内存地址赋值给指针 pRes。...因为引用不是对象,故无引用数组,指向引用指针到引用引用: int& a[5]; // 错误 int&* p;   // 错误 int& &r;   // 错误 所以修改函数int func(...、引用区别和联系 值:实参拷贝传递给形参。...就是把实参赋值给形参,赋值完毕后实参就和形参没有任何联系,对形参修改就不会影响到实参。 地址:把实参地址拷贝传递给形参。就是把实参地址复制给形参。...无论值还是指针,函数都会生成一个临时变量,但引用时,不会生成临时变量, 值时,只可以引用值而不可以改变值,但值引用时,可以改变值, 指针时,只可以改变指针所指内容,不可以改变指针本身,但指针引用时

    2.7K40

    jvm中类和对象定义存储基础知识

    Class文件结构主要有两种数据结构:符号数和表 符号数:用来表述数字,索引引用、数量值以及字符串等,比如图1中类型为u1,u2,u4,u8分别代表1个字节,2个字节,4个字节,8个字节符号数。...表:表是有由多个符号数以及其它表组成复合结构,比如图1中类型以_info结尾项为表类型。...如下图javap生成类定义信息 图13 1.Code1方法执行过程: 构造方法:descriptor ()V标识返回值为Void方法索引,flags可见性修饰符; 程序运行时,先将常量池、方法字节码...直接引用: 指向目标的指针或者相对偏移量 类和接口解析举例:类A在解析阶段发现自己符号引用了B,如果这个时候B还没被加载。...a、apend字符串b 然后toString(new方法)生成字符串ab对象并在字符串常量池生成引用返回,为什么不要字符串相加,就是因为会生成大量StringBuilder对象 String s = "

    22910

    硬核 | C++ 基础大全

    符号生成之后就不会再改,因此指针可以改变其指向对象(指针变量中值可以改),而引用对象则不能修改。...参数构造函数: 即默认构造函数,如果没有明确写出参数构造函数,编译器会自动生成默认参数构造函数,函数为空,什么也不做,如果不想使用自动生成参构造函数,必需要自己显示写出一个参构造函数。...指针指向一块内存,指针内容是所指向内存地址,在编译时候,则是指针变量名-指针变量地址”添加到符号表中,所以说,指针包含内容是可以改变,允许拷贝和赋值,有 const 和非 const...而对于引用来说,它只是一块内存别名,在添加到符号时候,是"引用变量名-引用对象地址"添加到符号表中,符号表一经完成不能改变,所以引用必须而且只能在定义时被绑定到一块内存上,后续不能更改,也不能为空...当一个对象需要以值方式进行传递时,编译器会生成代码调用它拷贝构造函数生成一个副本,如果类 A 拷贝构造函数参数不是引用传递,而是采用值传递,那么就又需要为了创建传递给拷贝构造函数参数临时对象,

    1.2K10

    【C语言】深入解开指针(二)

    四、指针使⽤和址调⽤ 4.1 strlen模拟实现 库函数strlen功能是求字符串⻓度,统计字符串中 \0 之前字符个数。...在调⽤Swap1函数时,a和b传递给了Swap1函数,在Swap1函数内部创建了形参x和 y 接收a和b值,但是x地址是0x008ffdc4,y地址是0x008ffdc8,x和y确实接收到了a和...Swap1函数在使⽤时候,是把变量本⾝直接传递给了函数,这种调⽤函数⽅式我们之前在函数时候就知道了,这种叫值调⽤。...b=%d\n", a, b); return 0; } 我们可以看到实现成Swap2⽅式,这⾥调⽤Swap2函数时候是变量地址传递给了函数,这种函数调⽤⽅式叫:址调⽤ 结论: 址调用...总结 通过本章我们学习了const修饰变量和指针变量,指针**+ -**整数,指针-指针指针关系运算,以及野指针形成原因,怎么去预防野指针值调用和址调用区别。

    11310

    c++从入门到进阶--引用与常量

    //指向常量指针,而非常指针。...int d=10; b=&d; //也可以一个非const地址赋给 指向const指针 但是不能通过该指针改变该变量内容。...指针 指针值初始化后不能改变指向固定单元(只能指一次) *poi=99;//const限定是poi值;可以对指向内容修改,但不可以对指针指向对象修改。...)参数传递过程 实参值拷贝一份放到函数形参中 3)函数参有三种参方式:值、址、引用 ①按值传递 ⅰ形参和实参各占一个独立存储空间。...ⅱ形参存储空间是函数被调用时才分配,调用开始,系统为形参开辟一个临时存储区,然后各实参传递给形参,这是形参就得到了实参值。

    77220

    GoRustKotlin 协程和队列性能评测

    整数(0:int):这种类型消息,几乎不涉及内存分配 字符串(1:str):这种类型消息,是各语言默认字符串复制,Rust 会有一次内存分配,Go/Kotlin 则是共享字符内容,生成包装对象 字符串指针...,然后请求投递给处理协程。...Golang 中字符串是不可变,所以复制不对字符串内容做复制,仅重新生成一个轻量包装,所以,在实现中,通过strings.Clone方法来进行全复制 Rust 字符串复制总是全复制 Kotlin...中字符串是不可变,复制仅生成一个轻量包装,通过String.String(chars)来进行全复制 字符串指针消息复制 Golang 中轻量字符串指针,所以复制仅是指针复制 Rust 轻量字符串为...Kotlin轻量字符串是 String ,实际即是字符串指针 Rust 中队列选择 Rust 生态中中有许多队列实现可选,经过测评,队列使用了 futures::channel::mpsc, 相比

    1.8K50

    『C++』我想学C++,C++太难了,那我想入门,给我10分钟我带你入门

    ⅱ形参存储空间是函数被调用时才分配,调用开始,系统为形参开辟一个临时存储区,然后各实参传递给形参,这是形参就得到了实参值。...,变量r类型是 double * void *s; //s是一个指针变量,变量s类型。...通过指针访问指向内存空间 int*p=int *40000;//指向向地址40000; *p =123; 123存入p所指向地址后若干字节(sizeof(int))内存空间。...(3)调用 int a3(x)后,x值也得等于5;此时不再是参,而是址,相当于w=a,w与a所指向地址相同。...int d=10; b=&d; //也可以一个非const地址赋给 指向const指针 但是不能通过该指针改变该变量内容。

    1.6K10

    【C# 基础精讲】C# 数据类型概述

    下面依次介绍这三大类数据类型,并列出C#中常见每种类型。 值类型 值类型直接存储数据实际值,它们是分配在栈上。当值类型被赋值给另一个变量或传递给函数时,复制是该值本身,而不是其引用。...short:16位有符号整数,范围约为 -32,768 到 32,767。 byte:8位符号整数,范围约为 0 到 255。 2....引用类型 引用类型存储是对象引用,而不是实际数据。引用类型变量在栈上存储指向堆中对象内存地址。当引用类型被赋值给另一个变量或传递给函数时,复制是对象引用,而不是对象本身。...C#中引用类型有以下几种: 1. 字符串类型: string:字符串类型,用于表示一系列字符。 2. 数组类型: int[]:整数数组,用于存储一组整数值。...C#中指针类型主要形式如下: type* identifier; 例如: int*:指向整数类型指针。 char*:指向字符类型指针

    18020

    php引用值详解

    php引用(就是在变量或者函数 、对象等前面加上&符号) 在PHP 中引用意思是:不同名字访问同一个变量内容....与C语言中指针是有差别的.C语言中指针里面存储是变量内容在内存中存放地址 变量引用 PHP 引用允许你用两个变量来指向同一个内容 <?..., 他作用是 return $b中 $b变量内存地址与$a变量内存地址 指向了同一个地方 即产生了相当于这样效果($a=&b;) 所以改变$a值 也同时改变了$b值 所以在执行了 $a=...//下面再来个小插曲 php中对于地址指向(类似指针)功能 不是由用户自己来实现,是由Zend 核心实现,php中引用采用是“写时拷贝”原理,就是除非发生写操作,指向同一个地址变量或者对象是不会被拷贝..."; 由于$a与$b所指向内存数据 要重新写一次了,此时Zend核心会自动判断 自动为$b生成一个$a数据拷贝,重新申请一块内存进行存储

    5.2K20

    【C++】42道面试经典问题总结

    int sum(int,int); //在C语言下只会根据函数名生成符号,在C++下会根据函数名+参数列表生成符号 #ifdef __cplusplus } #endif C++什么时候会出现访问越界...str;str[2] 4.array内存不可扩容数组 5.字符串处理,没有添加’\0’字符,导致访问字符串时候越界· 6.使用类型强转,让一个大类型(派生类)指针指向一块小内存(基类对象)...编译:预编译、编译、汇编、生成二进制可重定位obj文件*.o 链接:合并段,符号解析、符号重定向生成可执行文件 初始化全局变量和未初始化全局变量有什么区别?...局部变量存放stack上,通过ebp指针偏移-4来访问,不会产生符号 拷贝构造函数,为什么引用不值?...早绑定(静态绑定): 编译时期绑定,普通函数调用,用对象调用虚函数,在Call编译阶段就已经知道调用那个函数了 晚绑定(动态绑定):用指针/引用调用虚函数时候,都是动态绑定 p->vfptr

    8910

    C++编程经验(12):C++11新特性

    update(dynamic_cast(pw)); // 正确,传递给 update 函数一个指针指向变量类型为 son pw 指针 void updateViaRef(son&...传递给 updateViaRef 函数 SpecialWidget pw 指针 ---- 智能指针 智能指针是存储指向动态分配(堆)对象指针类。...除了能够在适当时间自动删除指向对象外,他们工作机制很像C++内置指针。 在使用对象时候,使用强智能指针;在引用对象时候,使用弱智能指针。...---- 绑定器是干嘛呢?参数绑定到函数指针。 以前绑定器只能绑定一个参数,所以我们看到很多古老需要函数指针函数都只有一个参数传递,但是有了新绑定器就不一样了。...如果给类手动写了带参构造,那也是无法显式使用参构造函数了。 如果没有了默认构造,子类就不能不参给父类进行构造了。

    1K20
    领券