通过cmake在Android中调用c语言,且三方应用通过so库调用c语言
1、 新建JniUtils类实现native方法

2、 在build中执行clean project 再rebuild project 生成class文件。
注意:最新版本的AndroidStudio中classes文件的路径是在\app\build\intermediates\javac\debug\compileDebugJavaWithJavac\classes。而原来的版本classes路径是在\app\build\intermediates\classes

3、 通过javah -jni 生成对应的.h文件
注意:
3.1、在执行该命令时要在classes路径下执行,否则会报找不到JniUtils的类文件,且执行时不带文件后缀
3.2、生成的.h文件也是在classes路径下
.h路径:

成功时:

失败时:

4、 新建jni文件夹,把上述中的.h文件拷贝到jni文件夹下,且在jni路径下新建一个c语言文件,实现.h中的方法(注意方法名要保持一致)


5、 接下来开始通过cmake生成so文件
5.1、把CMakeList.txt文件拷贝到app路径下,注意CMakeList中的一些设置,在add_library中要设置需要编译的源文件,在target_link_libraries中要设置输出的so文件名,eg设置为serial_port则生成的so名为libserial_port。执行完之后,要右键app,选择Link C++ project with grade



5.2、在app路径下的build.gradle中配置cmake,且在JniUtils.java中设置System.loadLibrary注意libname为在CMakeList中设置的保持一致


5.3、点击sync工程之后,在clean Project时,如果报如下错误,则重启AndroidStudio试下,大概率的能成功clean

5.4、通过上步的clean Project之后,再Rebuild Project会生成so文件,路径如下

6、 把上述生成的so库拷贝到libs路径下,运行即可。
7、三方应用如果也想调用上述的so文件方法如下
7.1、需要把so拷贝到libs路径下,然后在app路径下的build.gradle中的android里设置

7.2、也要创建对应的native方法,注意路径要和so库里的路径完全一样。然后就可以成功调用了

参考demo:https://github.com/lelelongwang/TestApp
通过cmake在Android中调用c语言,且三方应用通过so库调用c语言的更多相关文章
- Android中通过WebView控件实现与JavaScript方法相互调用的地图应用
在Android中通过WebView控件,可以实现要加载的页面与Android方法相互调用,我们要实现WebView中的addJavascriptInterface方法,这样html才能调用andro ...
- android中按电源键锁屏然后解锁导致Activity调用onDestory以及如何防止锁屏
今天在android项目中按电源键锁屏,然后解锁,发现子Activity关闭了,回到了主页,这个问题困扰了我很久,最后打log发现,在按电源键的时候,调用了子Activity的onDestroy()方 ...
- Android中关于JNI 的学习(零)简单的样例,简单地入门
Android中JNI的作用,就是让Java可以去调用由C/C++实现的代码,为了实现这个功能.须要用到Anrdoid提供的NDK工具包,在这里不讲怎样配置了,好麻烦,配置了好久. . . 本质上,J ...
- android中SharedPreferences
SharedPreferences:用于存储少量并且数据格式简单,基本上都是普通的字符串,标量类型的值,比如:应用程序的各种配置信息等. SharedPreferences:保存的数据格式主要是key ...
- 在 Android 中如何调用 C 语言?
当我们的 Java 需要调用 C 语言的时候可以通过 JNI 的方式,Java Native Interface.Android 提供了对 JNI 的支持, 因此我们在 Android 中可以使用 J ...
- Android中实现如下多语言选择Radiobutton效果
手边的samsung手机设置多语言的方式一般是点击设置多语言的一栏后进入到多语言选择界面,选择完成之后当前的语言环境用小字方式直接显示在设置多语言栏的下方.另一种选择多语言的方式如上图所示,我也在系统 ...
- 在Android 中使用KSOAP2调用WebService
WebService 是一种基于SOAP协议的远程调用标准.通过WebService可以将不同操作系统平台,不同语言.不同技术整合到一起.在Android SDK中并没有提供调用WebService的 ...
- android 中调用接口发送短信
android中可以通过两种方式发送短信 第一:调用系统短信接口直接发送短信:主要代码如下: //直接调用短信接口发短信 SmsManager smsManager = SmsManager.getD ...
- 在Android中调用WebService
某些情况下我们可能需要与Mysql或者Oracle数据库进行数据交互,有些朋友的第一反应就是直接在Android中加载驱动然后进行数据的增删改查.我个人不推荐这种做法,一是手机毕竟不是电脑,操作大量数 ...
随机推荐
- Java安全之反序列化回显研究
Java安全之反序列化回显研究 0x00 前言 续上文反序列化回显与内存马,继续来看看反序列化回显的方式.上篇文中其实是利用中间件中存储的Request 和Response对象来进行回显.但并不止这么 ...
- .Net Core:限流
一.环境 1.vs2019 2..Net Core 3.1 3.引用 AspNetCoreRateLimit 4.0.1 二.基础使用 1.设置 在Startup文件中配置如下,把配置项都放在前面: ...
- 『心善渊』Selenium3.0基础 — 17、Selenium操作浏览器窗口的滚动条
目录 1.为什么操作滚动条 2.Selenium如何操作滚动条 3.Selenium操作滚动条方法 4.操作滚动条示例 5.下拉至聚焦元素的位置 (1)实现步骤: (2)实现示例: 1.为什么操作滚动 ...
- VSCode 使用 Code Runner 插件无法编译运行文件名带空格的文件
本文同时在我的博客发布:VSCode 使用 Code Runner 插件无法编译运行文件名带空格的文件 - Skykguj 's Blog (sky390.cn) 使用 Visual Studio C ...
- hdu 1754 I Hate It 线段树 单点更新 区间最值
线段树功能:update:单点更新 query:区间最值 #include <bits/stdc++.h> #define lson l, m, rt<<1 #define r ...
- Gym 101147G 第二类斯特林数
大致题意: n个孩子,k场比赛,每个孩子至少参加一场比赛,且每场比赛只能由一个孩子参加.问有多少种分配方式. 分析: k>n,就无法分配了. k<=n.把n分成k堆的方案数乘以n的阶乘.N ...
- Murmur3 Hash 128位java和C#方法
java调用com.google.guava 引入依赖 <dependency> <groupId>com.google.guava</groupId> <a ...
- CentOS-Docker安装MongoDB(单点)
下载镜像 $ docker pull mongo 创建相关目录 $ mkdir -p /usr/mongo/data /usr/mongo/dump 运行镜像 $ docker run --resta ...
- CentOS-查找删除历史文件
背景:因服务器磁盘空间有限,根据实际情况控制保留指定的几天内的历史文件 find参数说明: /home/tmp 设置查找的目录 -mtime +30 设置修改时间为30天前 ...
- CentOS-GitLab迁移(yum至Docker)
yum备份迁移Docker版的GitLab 注:确保版本一致 1.yum备份 $ gitlab-rake gitlab:backup:create 2.执行完成后,在/var/opt/gitlab/b ...