前言:之前看安卓软件安全与逆向分析这书,看到ndk开发这节,发现自己连so文件都没编译操作过233,所以就直接上手试试,

感觉挺好玩的,把关键的加密流程都放进so中去实现,这周先写个demo试试,感觉出题还是得和安卓的运行机制结合,然后

再一个点到一个点来玩,比较有条理,之后放到github上,之后作为招新赛的题目来搞

直接切入主题了,就不放图了,要看图的直接看我放的链接吧,里面图文并茂,这里主要是我的个人记录

1.androidstudio直接新建一个项目,往下划,然后选择c++

2.然后这里先去配置好ndk的路径,因为编译的工具都在ndk中,这里我是mac,所以找ndk的路径一开始有点懵逼

然后百度了一波,才找到,

然后自己查看自己的ndk路径在哪,点进去,相应路径输入好就行了,不知道为啥,我ndk默认配好了,233,不过配置文件local.properties里面没加,所以我又加了这句话

## This file is automatically generated by Android Studio.
# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
#
# This file should *NOT* be checked into Version Control Systems,
# as it contains information specific to your local configuration.
#
# Location of the SDK. This is only used by Gradle.
# For customization when using a Version Control System, please read the
# header note.
sdk.dir=/Users/mac/Library/Android/sdk
ndk.dir=/Users/mac/Library/Android/sdk/ndk/21.3.6528147

3.新建一个Myjni.java文件,然后javac和javah,然后把后缀.h文件拖到cpp文件夹下面,全程终端操作,这里还是看我放的那个链接去搞,我懒得放图了。。。

4.然后在cpp文件夹下面新建main.c文件,里面内容就是实现之前定义到Myjni.java文件中的native方法,

//
// Created by mac on 2020/9/29.
//
#include "com_example_firstso_Myjni.h"
#include "../../../../../../Library/Android/sdk/ndk/21.3.6528147/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/jni.h"
#include <jni.h>
JNIEXPORT jstring JNICALL Java_com_example_firstso_Myjni_sayHello(JNIEnv * env, jclass jobj) {
// TODO: implement sayHello()
return (*env)->NewStringUTF(env,"hello world");
}

5.然后synow以下,build一波,已经在对应目录app/build/merged_native_libs/debug/out/lib下生成了不同平台架构的so文件了,我感觉蛮骚的,直接四个平台都生成了,是我没想到的,

当然还是得切换一个project的视角,用安卓是看不到这玩意的。

6.然后把lib的整个目录,复制到src/main下,记得把lib名字改成jniLIB,就可以正常运行了

整篇写的贼水,mac的截图键实在鸡肋,服了)

参考链接:

https://www.jianshu.com/p/25008b219fa6

androidstudio创建第一个so文件的更多相关文章

  1. vue环境搭建与创建第一个vuejs文件

    我们在前端学习中,学会了HTML.CSS.JS之后一般会选择学习一些框架,比如Jquery.AngularJs等.这个系列的博文是针对于学习Vue.js的同学展开的. 1.如何简单地使用Vue.js ...

  2. 创建第一个HTML文件

    首先右键新建文本文档,然后打开新建的文档,文本内容写上: <html> <head> <title>我的HTML标题</title> </head ...

  3. C语言 创建一个 txt 文件 bin输入字符 保存文件在工作文件夹里

    int main(void) { char s[70]; FILE *fp; fp=fopen("123.txt","r"); if((fp=fopen(&qu ...

  4. logback 指定每隔一段时间创建一个日志文件

    我使用的logback版本是1.2.3 目前logback支持根据时间来配置产生日志文件,但是只支持每周,每天,每个小时,每分钟等创建一个文件,配置如下: <appender name=&quo ...

  5. 使用SQL语句创建数据库1——创建一个数据库文件和一个日志文件的数据库

    目的:创建一个数据库文件和一个日志文件的数据库 在matser数据库下新建查询,输入的命令如下: USE master——指向当前使用的数据库.创建数据库实际上是向master数据库中增加一条数据库信 ...

  6. HTML 5 应用程序缓存(Application Cache)cache manifest 文件使用 html5 中创建manifest缓存以及更新方法 一个manifest文件会创建一份缓存,不同的manifest文件其缓存的内容是互不干扰的

    HTML5 离线缓存-manifest简介 HTML 5 应用程序缓存 使用 HTML5,通过创建 cache manifest 文件,可以轻松地创建 web 应用的离线版本. 什么是应用程序缓存(A ...

  7. Eclipse创建第一个Servlet(Dynamic Web Project方式)、第一个Web Fragment Project(web容器向jar中寻找class文件)

    创建第一个Servlet(Dynamic Web Project方式) 注意:无论是以注解的方式还是xml的方式配置一个servlet,servlet的url-pattern一定要以一个"/ ...

  8. 如何在Qt Creator 创建一个.pri文件

    如何在Qt Creator 创建一个.pri文件 2013年10月09日 ⁄ 综合 ⁄ 共 254字 ⁄ 字号 小 中 大 ⁄ 评论关闭   这个问题很少人写,因为比较简单,但是让却让我花了好大功夫才 ...

  9. 判断本地系统目录下是否存在XML文件,如果不存在就创建一个XMl文件,若存在就在里面执行添加数据

    这是我为项目中写的一个测试的例子, 假如,您需要这样一个xml文件, <?xml version="1.0" encoding="utf-8"?> ...

随机推荐

  1. centos 7安装freescale交叉编译工具链

    方法1:可以直接下载gcc包,把文件夹放到/usr/local下即可,然后修改PATH环境变量,既可以使用 方法2:可以下载.rpm包,在本地进行安装,下载地址为(http://www.panduod ...

  2. [LeetCode] 231. 2 的幂

    位运算 231. 2 的幂 ``` class Solution { public boolean isPowerOfTwo(int n) { int cnt = 0; while (n>0) ...

  3. OpenResty 最佳实践

    OpenResty 最佳实践 https://moonbingbing.gitbooks.io/openresty-best-practices/content/index.html

  4. GPU特征处理技术

    GPU特征处理技术 GPU和CPU有何不同? 现代片上系统(SoC)通常集成中央处理器(CPU)和图形处理器(GPU).设计不同,这可能更取决于处理的数据集的类型. CPU经过优化,可以一次对几块数据 ...

  5. GPU上如何优化卷积

    GPU上如何优化卷积 本文将演示如何在TVM中编写高性能卷积实现.我们以平方大小的输入张量和滤波器为例,假设卷积的输入是大批量的.在本例中,使用不同的布局来存储数据,以实现更好的数据局部性.缓冲区布局 ...

  6. Django基础之模板层

    内容概要 模板层(模板语法) 模板语法传值​模板语法过滤器(内置方法)​模板语法标签(流程控制)​自定义过滤器和标签(了解) 模板的导入与继承(面向对象) 内容详细 1 模板层之模板语法传值 http ...

  7. .Net RabbitMQ实战指南——HTTP API接口调用

    RabbitMQ Management插件还提供了基于RESTful风格的HTTP API接口来方便调用.一共涉及4种HTTP方法:GET.PUT.DELETE和POST.GET方法一般用来获取如集群 ...

  8. centos7 安装卸载程序rpm使用方法

    1.安装 rpm 包: ➢ 基本语法 rpm -ivh RPM 包全路径名称 2.卸载 rpm 包: ➢ 基本语法 rpm -e RPM 包的名称 ➢ 应用案例 删除 firefox 软件包 rpm ...

  9. Transformers for Graph Representation

    Do Transformers Really Perform Badfor Graph Representation? microsoft/Graphormer: This is the offici ...

  10. linux命令基础(一课)

    一.Linux命令基础 1.shell Linux系统中运行的一种特殊程序 在用户和内核之间充当'翻译官' 用户登录Linux系统时,自动加载一个shell程序 bash是Linux系统中默认使用的s ...