前言:之前看安卓软件安全与逆向分析这书,看到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. linux进程间通信-(转自 临水)

    一.进程间通信概述进程通信有如下一些目的:A.数据传输:一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几M字节之间B.共享数据:多个进程想要操作共享数据,一个进程对共享数据的修改,别 ...

  2. python3 摆放家具练习

    摆放家具 需求: 1)房子有户型,总面积和家具名称列表 新房子没有任何家具 2)家具有名字和占地面积.其中: 床:占4平米 衣柜:占2平米 餐桌:占1.5平米 3)将以上三件家具添加到房子中 4)打印 ...

  3. Springboot2.x入门——helloWorld

    Springboot2.x入门--helloWorld 一.简介 1.1 Springboot简介 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的 ...

  4. protege 构建本体

    这里我们使用的是Protégé-OWL规范. 推理机后的内容主要是实操内容,根据推理机来对protege本体模型的一个操作过程,以加深本体模型的一个规范认识. 一.什么是本体(Ontologie) 本 ...

  5. 解决Caused by: org.apache.ibatis.exceptions.PersistenceException:

    在mybatis-config核心配置文件中注册了xml以后出现了新的异常错误 Caused by: java.io.IOException: Could not find resource cn.d ...

  6. go语言json技巧

    go语言json技巧 本文总结了在项目中遇到的那些关于go语言JSON数据与结构体之间相互转换的问题及解决办法. 基本的序列化 首先我们来看一下Go语言中json.Marshal()(系列化)与jso ...

  7. K8s - Kubernetes重要概念介绍(Cluster、Master、Node、Pod、Controller、Service、Namespace)

    K8s - Kubernetes重要概念介绍(Cluster.Master.Node.Pod.Controller.Service.Namespace)       Kubernetes 是目前发展最 ...

  8. python做反被爬保护的方法

    python做反被爬保护的方法 网络爬虫,是一个自动提取网页的程序,它为搜索引擎从万维网上下载网页,是搜索引擎的重要组成.但是当网络爬虫被滥用后,互联网上就出现太多同质的东西,原创得不到保护.于是,很 ...

  9. GO语言面向对象03---接口与断言

    接口的实现 package main import "fmt" type Animal interface { //出生 SayHelloWord() //死亡 Godie() / ...

  10. 根据某个数据 来筛选 DataTree 分支数里面的数据是否符合规则 进行筛选分支,展示

    问题:如何在 DataTree 树形数据里每个分支里根据特定某个元素值,然后挑选出来 思路:先把分支提取出来,每个都要进行判断. 主要用到的电池: >.Cull Pattern 拓展资料:以下是 ...