网站首页 > 技术文章 正文
有那么一段时间没有给大家进行技术分享了,比较忙,赶项目,今天给大几分享一些Android开发里面的NDK。
同时,在给大家分享之前,这里推荐下我自己建的Android技术分享群 :653961128,不管你是小白还是大牛,小编我都挺欢迎,不定期分享干货,包括2017最新的Android企业案例学习资料和零基础入门教程,欢迎初学和进阶中的小伙伴,大家一起交流学习,共同进步。
Android studio 开发JNI 现在主要有两个方式:
1、自己写 Android.mk / Application.mk。
2、通过Cmake。支持Android studio 2.2 以上版本
此次分享主要使用第一种方法,通过自己写Android.mk / Application.mk 的方式来实现开发JNI
第一步:配置NDK。
第二步:编写 java 代码,声明 native 函数
第三步:编写Native 代码。在main 目录下创建 jni 文件夹,然后创建一个c或者cpp文件。
不用生成什么头文件了,直接写c代码。首先是返回值
这是 Java 类型与 native 类型的对应关系。
然后是方法名,方法名有自己固定的格式,Java_+包名+类名+方法名。
最后是参数,JNIEnv 与 jobject 是必要的两个参数,然后自己的参数跟随在后。
规定是每个函数默认都会两个参数,一个是 JNIEnv 指针类型的结构体,一个是调用者对象,比如我们这里就是MainActivity对象,其实玩过 c++ 的都知道里面每个函数其实默认也会传入个 this 指针的。
如果创建的是 cpp文件 得加上 extern "C" ,原因很简单,在 C++ 中函数在编译的时候会拼接上参数,这也是 c++ 中函数重载的处理机制,比如一个 set(int a) 和一个 set(int a,int b) ,在编译的时候就变成了 set_int 与 set_int_int ,我们加上extern ”C“ 就表示想按照C来编译,所以函数名字后面就不会拼接上参数类型了。
第四步:Android.mk / Application.mk
Android.mk
Application.mk
第五步:执行 ndk-build。在Android studio 中的 terminal 中,进入的 src/main 目录中,执行 ndk-build 命令,这个时候会在main 目录下生成 libs 与 obj目录。
第六步:在 app的 build.gradle 文件中的 android{}块中添加如下代码
最后开始运行,就能够成功调用 native 代码。
重要!!!!!!!!!!!!!!!!!!!!!!!!!!分割线
在JNI开发当中你可能回遇到的一些问题:
1、ndk-build 命令执行失败:
(1)错误信息:command not find。是否配置了NDK的环境变量。
(2) 错误信息:No rule to make target , needed by `obj/local/armeabi-v7a/objs/test/test.o'. Stop. 请检查Android.mk中的源文件名和jni下的文件名是否一样,路径是否一样。
2、编译失败:
(1)Error:Execution failed for task ':app:compileDebugNdk'.Error: Your project contains C++ files but it is not using a supported native build system. 检查在第六步中配置的suorceSets信息。jni的目录是否和配置中写的一样。Android studio 默认为jni,但是也要写成[].
3、运行时崩溃:
(1)错误信息:UnsatisfiedLinkError ........ .so not find。so库没有找到,需要注意System.loadLibrary时的名字,与生成的so库的名字是否一样,注意,java代码中不需要前缀lib。同时需要检查第六步中设置的sourceSets中的jnilibs的目录是否和生成的so库的目录一样。
(2)错误信息:UnsatisfiedLinkError: No implementation found 检查方法名,是否按照了 native 的规则书写。
猜你喜欢
- 2024-10-27 NDK开发——FFmpeg视频解码 ffmpeg ndk
- 2024-10-27 Camera基本代码架构 camera calibrator
- 2024-10-27 android 功耗分析方法和优化(1) 功耗app
- 2024-10-27 Cocos Creator v2.3.2 发布了!全新 Launcher 效率飞起!
- 2024-10-27 如何androd动态注册编写计算器 淘宝动态评分计算器在线
- 2024-10-27 高通平台OV8856 Camera的bring up总结
- 2024-10-27 高通平台移植GC2145 Camera驱动 高通驱动安装
- 2024-10-27 《坎公骑冠剑》光炮Android Mk.99技能与背景故事
- 2024-10-27 ubuntu移植libwebp到Android平台 ubuntu移植到arm
- 2024-10-27 步步为营,十分钟学会 Native JNI(附带彩蛋)
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)