《移动安全》(7)so文件生成与调用
我们在做移动安全的过程中,会遇到so文件,那么so文件到底是什么?它是如何调用的?它与java代码有什么关系?
1.新建Android Studio项目,并新建JniTest类
JniTest.java
package com.sy.sohelloworld;
public class JniTest {
static {
System.loadLibrary("JniTest");
}
public native static String getString();
}
之后make project,在app/build目录下会生成.class文件。
2. 在app/src/main文件夹下新建jni文件夹,在Android Studio的终端进入该目录下,执行以下命令,会在当前目录生成com_sy_sohelloworld_JniTest.h文件:
javah -jni -classpath D:\AndroidHome\workspace\SoHelloWorld\app\build\intermediates\javac\debug\classes com.sy.sohelloworld.JniTest
3.在jni目录下新建test.c文件,并且实现之前.h文件中的方法。
#include "jni.h"
#include "com_sy_sohelloworld_JniTest.h"
JNIEXPORT jstring JNICALL Java_com_sy_sohelloworld_JniTest_getString
(JNIEnv *env, jclass jz){
return (*env)->NewStringUTF(env,"flag is {21232f297a57a5a743894a0e4a801fc3}");
}
4. 利用ndk-build命令来生成.so文件,必须有Android.mk文件和Android.mk文件,并且与对应的.cpp/.c文件在同一个目录下。
Android.mk文件用于向构建系统描述源文件和共享库,用于定义 Application.mk、构建系统和环境变量所未定义的项目范围设置。Application.mk 文件实际上是定义要编译的多个变量的微小 GNU Makefile 片段。
(1)在jni目录下新建Android.mk文件
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := JniTest
LOCAL_SRC_FILES := Test.c
include $(BUILD_SHARED_LIBRARY)
(2)在jni目录下新建Application.mk文件
APP_ABI := all
(3)关联下载好的ndk包
(4)将ndk-build添加到环境变量中,之后cmd进入到jni目录下,执行命令ndk-build,成功生成so文件。
5.调用so文件
(1)在app/build.gradle文件添加如下配置:
sourceSets {
main() {
jniLibs.srcDirs = ['src/main/libs']
jni.srcDirs = [] //屏蔽默认的jni编译生成过程
}
}
(2)在layout/activity_main.xml文件添加如下代码:
android:id="@+id/textView"
(3)在MainActivity中调用
package com.sy.sohelloworld;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = (TextView) findViewById(R.id.textView);
textView.setText(JniTest.getString());
}
}
6.编译运行,如下所示:
相关文章
- Linux使用scp远程传输命令进行服务器文件互传(阿里云服务器)
- poi操作oracle数据库导出excel文件2
- linux守护进程--定期向文件中插入log记录
- MT7621安装的openwrt出现无法删除文件的问题
- iOS开发之网络编程--使用NSURLConnection实现大文件断点续传下载
- 用Python读写Excel文件(转)
- 用ABAP操作zip文件
- 正确使用阿里云NAS文件存储服务系列之文件权限校验
- 本地上传文件至Linux虚拟机报错“复制时发生出错“
- 如何用NotePad++查看二进制文件
- Web安全-之文件上传漏洞场景
- c# - WebClient下载https协议文件报错 System.Net.WebException: 请求被中止: 未能创建 SSL/TLS 安全通道 - 解决
- 【Android 安全】使用 360 加固宝加固应用 ( 购买高级加固服务 | 设置资源加固 | 设置 SO 文件保护配置 | 设置 SO 防盗用文件配置 | 反编译验证加固效果 )
- 【Android 安全】DEX 加密 ( Proguard 混淆 | 混淆后的报错信息 | Proguard 混淆映射文件 mapping.txt )
- 《Web安全渗透全套教程(40集)》学习笔记 | 文件上传漏洞原理及实验
- Linux之写开文件函数write
- gitignore文件不生效
- QT打印窗口、退出、设置字体及颜色、设置时间、控件实现系统函数、添加资源文件(菜单图片)、工具栏添加图片
- Linux 文件与目录管理
- 〖Python自动化办公篇⑪〗- word文件自动化 - word 转 PDF(pdfkit与pydocx相结合)
- WEB漏洞攻防 - 文件上传漏洞 - 配和文件解析漏洞绕过安全检测突破文件上传漏洞
- 检查YAML文件安全配置:kubesec
- Win10查看回收站清空超过1万个文件,占用资源高造成系统卡死,删除失败
- 修改VS2017打开在文件中查找窗口以及格式化代码的快捷键