【车联网安全系列】安卓漏挖之AS编写cmake生成so库

admin 2023年2月16日19:29:09评论18 views字数 1817阅读6分3秒阅读模式
【车联网安全系列】安卓漏挖之AS编写cmake生成so库


摘要

安卓漏挖第4步,学会编写so文件。


环境配置

确定安装了ndk, cmake.


下载NDK: 在 file->settings->System Settings->Android SDK->SDK Tools中检查NDK是否下载,如果没有就需要下载并配置一下,除了需要NDK之外,还需要下载CMake这个编译工具。


安装ndk的时候有个坑,我解压完有两层目录,所以报错找不到配置文件。所以需要注意解压完,进入目录里看一下。如果报错了,就根据报错信息检查代码,一般是代码有一些失误。


新建项目的时候, 记得选择 Native C++


【车联网安全系列】安卓漏挖之AS编写cmake生成so库


等待新建项目完成,会报错找不到ndk,所以我们配置一下

在Android视图下, 打开local.properties,加上ndk的路径


【车联网安全系列】安卓漏挖之AS编写cmake生成so库


 声明native方法

新建一个类, 声明native方法. 这个类是java与C/C++交互的中介, 方法由java声明, 由C/C++实现


这里为了方便接下来的操作, 切换成Project视图


【车联网安全系列】安卓漏挖之AS编写cmake生成so库

myJNI.java


【车联网安全系列】安卓漏挖之AS编写cmake生成so库


myJNI.java

package com.example.a04;

public class myJNI { static { System.loadLibrary("JniTest"); } public static native String sayHello();}



编译与头文件的生成

使用javac编译上述文件, 生成class文件

myJNI类所在的目录,右键在终端打开。


【车联网安全系列】安卓漏挖之AS编写cmake生成so库


javac myJNI.java 


确认自己的包名和类名。然后在java目录使用 javah -jni 包名.类名 命令生成.h头文件。注意一定要在java层目录下输入命令,不然会报错:找不到xxx类

javah -jni com.example.a04.myJNI

我java版本是1.8,如果是java11,用法应该是

javac -h . myJNI.java


将生成的com_example_test_myJNI.h拖到cpp目录下


【车联网安全系列】安卓漏挖之AS编写cmake生成so库


然后删掉原来cpp目录下的native-lib.cpp


【车联网安全系列】安卓漏挖之AS编写cmake生成so库



实现头文件的函数

cpp目录下新建main.c


【车联网安全系列】安卓漏挖之AS编写cmake生成so库


main.c中的内容, 首先是将头文件包括进来, 然后实现头文件中的sayHello方法


#include "com_example_a04_myJNI.h"

JNIEXPORT jstring JNICALL Java_com_example_a04_myJNI_sayHello (JNIEnv *env, jclass jobj) { return (*env)->NewStringUTF(env, "hello zjj!");}


由于我们使用CMake来生成so的, 所以要修改CMakeLists.txt来指定so名称so的源文件的相对路


【车联网安全系列】安卓漏挖之AS编写cmake生成so库


【车联网安全系列】安卓漏挖之AS编写cmake生成so库


然后,sync一下


【车联网安全系列】安卓漏挖之AS编写cmake生成so库



生成so库


Build->Rebuild Project来生成so库


生成的so在appbuildintermediatescmakedebugobj


【车联网安全系列】安卓漏挖之AS编写cmake生成so库



配置so库

app/src/main下新建jniLIB目录,并将生成的SO文件拷贝到该文件夹下

【车联网安全系列】安卓漏挖之AS编写cmake生成so库


【车联网安全系列】安卓漏挖之AS编写cmake生成so库



调用

打开MainActivity插入一条log来调用so中的sayHello方法,并连接手机调试


package com.example.a04;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;import android.util.Log;import android.widget.TextView;
import com.example.a04.databinding.ActivityMainBinding;
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Log.i("开始调用so中的方法",myJNI.sayHello()); }}


【车联网安全系列】安卓漏挖之AS编写cmake生成so库



参考链接

https://blog.csdn.net/A807296772/article/details/102298970    



【车联网安全系列】安卓漏挖之AS编写cmake生成so库


【车联网安全系列】安卓漏挖之AS编写cmake生成so库


原文始发于微信公众号(华云安):【车联网安全系列】安卓漏挖之“AS编写cmake生成so库”

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年2月16日19:29:09
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   【车联网安全系列】安卓漏挖之AS编写cmake生成so库https://cn-sec.com/archives/1555705.html

发表评论

匿名网友 填写信息