计算机系统应用教程网站

网站首页 > 技术文章 正文

AndroidNDK:架构师JNI 开发,知识从未如此性感

btikc 2024-10-27 08:34:41 技术文章 5 ℃ 0 评论

有那么一段时间没有给大家进行技术分享了,比较忙,赶项目,今天给大几分享一些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 的规则书写。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表