热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

(七)编写具有.so文件的AndroidAPK

适用于Androidstudio3.5以上的版本1.环境搭建准备确定安装了NDK和CMake,3.5版本还要下载LLDB,3.6版本默认有࿰

适用于Android studio 3.5以上的版本


1. 环境搭建准备

确定安装了NDK和CMake,3.5版本还要下载LLDB,3.6版本默认有,不需要安装。
在这里插入图片描述

2. 新建项目,并完成配置

在这里插入图片描述
拉到最下面,选择Native c++
在这里插入图片描述
打开夜神模拟器执行下面操作
在这里插入图片描述

填写项目信息。在添加SDK的时候,不要超出上面的SDK版本,这里也就是不能超过22,需要注意,不过新建之后还可以修改
在这里插入图片描述
在这里插入图片描述
构建过程中报错了,所以要构建
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
确定NDK安装位置
如果是离线包形式的ndk,选择离线包目录,如果是我们Android studio 中下载的,去这个目录下寻找,可能找不到,默认隐藏了,可以直接到SDK目录找ndk
在这里插入图片描述
点击ok后,等待构建完成
在这里插入图片描述
在这里插入图片描述

3. 声明native方法,即编写c或c++方法

就是去创建 c 或 c++ 方法

首先先切换项目到project
在这里插入图片描述
新建一个class(注意位置)
在这里插入图片描述
输入名称
在这里插入图片描述
输入下面代码(注意:灰色部分是自动生成的,不要手动输入)
在这里插入图片描述

4. 生成头文件,即使用javac去编译,生成.class文件

在这里插入图片描述
在当前目录下打开cmd
在这里插入图片描述
使用javac 编译该class
在这里插入图片描述

然后进入到java目录内
在这里插入图片描述
使用 javah 命令生成生成c\c++头文件(jni开发第一步)
在这里插入图片描述
将生成的文件,剪贴到cpp目录下
在这里插入图片描述
然后删除cpp目录下的该文件
在这里插入图片描述

5. 编写头文件函数

在 CPP 目录内新建文件 main.c
在这里插入图片描述
在这里插入图片描述
编写文件,将头文件包含进来,并实现sayHello方法

#include "com_example_mytest_myJNI.h"JNIEXPORT jstring JNICALL Java_com_example_mytest_myJNI_sayHello(JNIEnv *env,jclass jobj){return (*env) ->NewStringUTF(env,"hello c++");
}

(有红色报错,不着急)
在这里插入图片描述

使用CMake生成so文件,去修改CmakeLists.txt
在这里插入图片描述
在这里插入图片描述

6. 生成so库并在项目中调用

1-----重构项目
在这里插入图片描述
2----查看so文件
在这里插入图片描述

3—将so文件放入项目中

新建一个目录
在这里插入图片描述
在这里插入图片描述
找到含有so文件的目录
在这里插入图片描述
将上面的文件复制到新建的目录下
在这里插入图片描述
3----调用

进入 MainActivity,注释掉下面内容
在这里插入图片描述
修改和添加新内容
在这里插入图片描述
运行 app 到模拟器 查看效果
在这里插入图片描述

7. 对刚刚生成的apk进行逆向分析

1----将 apk 拖入 Androd Killer

2----找 hello c++ 文本哪里来的
可以找到函数调用,但是函数没有逻辑内容。

3----分析可能在 so 文件中,我们使用 IDA-Pro 进行 so文件分析

4----查看该文件中的字符串
在这里插入图片描述
就会多出来一个这个窗口
在这里插入图片描述
该窗口有我们所有的该apk使用到的字符串
在这里插入图片描述
双击该字符串,就会跳转到指定位置,进行修改或者查看

修改和保存的两个方法:

  • 可以通过 F2 进行修改和保存(需要注意鼠标放置的位置),第一次可以进行修改,再按F2进行保存
  • 也可以直接通过 patch 修改
    在这里插入图片描述
    需要将hello c++!改为 hello world!
    百度 http://www.asciima.com/。通过字母进行查看ascll码

然后将修改写入文件:(一定要保存到文件)
在这里插入图片描述
在这里插入图片描述
然后需要关闭 IDA-Pro 。否则会占用文件,无法打包。


推荐阅读
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • 导出功能protectedvoidbtnExport(objectsender,EventArgse){用来打开下载窗口stringfileName中 ... [详细]
  • 如何用JNI技术调用Java接口以及提高Java性能的详解
    本文介绍了如何使用JNI技术调用Java接口,并详细解析了如何通过JNI技术提高Java的性能。同时还讨论了JNI调用Java的private方法、Java开发中使用JNI技术的情况以及使用Java的JNI技术调用C++时的运行效率问题。文章还介绍了JNIEnv类型的使用方法,包括创建Java对象、调用Java对象的方法、获取Java对象的属性等操作。 ... [详细]
  • node.jsrequire和ES6导入导出的区别原 ... [详细]
  • 本文概述了JNI的原理以及常用方法。JNI提供了一种Java字节码调用C/C++的解决方案,但引用类型不能直接在Native层使用,需要进行类型转化。多维数组(包括二维数组)都是引用类型,需要使用jobjectArray类型来存取其值。此外,由于Java支持函数重载,根据函数名无法找到对应的JNI函数,因此介绍了JNI函数签名信息的解决方案。 ... [详细]
  • 本文是一篇翻译文章,介绍了async/await的用法和特点。async关键字被放置在函数前面,意味着该函数总是返回一个promise。文章还提到了可以显式返回一个promise的方法。该特性使得async/await更易于理解和使用。本文还提到了一些可能的错误,并希望读者能够指正。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文详细介绍了Android中的坐标系以及与View相关的方法。首先介绍了Android坐标系和视图坐标系的概念,并通过图示进行了解释。接着提到了View的大小可以超过手机屏幕,并且只有在手机屏幕内才能看到。最后,作者表示将在后续文章中继续探讨与View相关的内容。 ... [详细]
author-avatar
鱼鱼de眼泪2012
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有