Android Studio

Android Studio

TOC

一、Android APK文件结构

1.Andriod APK文件结构

  • 清单文件:注册了当前APP的activity、service、broadcastReceiver等重要组件,以及一些权限的申请;入口类的特征,相当与OEP:
  • 源代码:MainActivity
packagecom.bluelesson.a23android;
// 包名,相当于C++中的命令空间

// 相当于导入头文件,现在是导入一个类名(完整类名包含包名)
// (因为java中一个类文件一般存一个类)
importandroid.support.v7.app.AppCompatActivity;
importandroid.os.Bundle;

// 继承自AppCompatActivity类
public class MainActivity extends AppCompatActivity {
    // 相当于C++的虚函数
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // 调用父类的方法
        super.onCreate(savedInstanceState);
        // 设置当前类依赖的资源文件
        // 参数是资源文件
        // 和窗口绑定的资源文件叫布局文件
        setContentView(R.layout.activity_main);
    }
}
  • 资源:res
  • 界面布局:界面视图和代码视图

2.AS生成的apk的目录

  • 基本的APK是一个压缩包,其中包含:
    • META-INF:签名信息,包括公司信息、文件的HASH值
    • Res:资源信息,包括图片、xml(布局文件、字符串、风格样式等)
    • AndroidMainfest.xml:清单文件,包括APK包名、四大组件的一些申明定义、权限、程序的入口
    • Classes.dex:可执行文件,包括java的类信息、方法信息、字段信息、虚拟机指令
    • Resources.arsc:资源序号文件,包括资源里的所有ID、名称。
  • 资源ID对应文件是R.class
  • dex文件的生成流程是从java源码 -> class文件 -> dex文件
  • Lib动态库,扩展名是.so,包括C++代码,各种平台:x86、arm

二、Android四大组件与权限🔗

1.Activity:界面,窗口
2.Service:服务,后台处理线程
3.BroadcastReceicer:广播接收者,消息hook
4.ContentProvider:内容提供者,为数据访问封装接口

三、AS使用ndk-build生成.so文件

1.下载并配置好ndk:下载地址https://dl.google.com/android/repository/android-ndk-r15c-windows-x86_64.zip

2.新建一个AS工程Android00;新建一个MyJni.java文件

  • MyJni.java
package com.example.ynag.android00;

public class MyJni {
    static {
        System.loadLibrary("MyJni");
    }
    public native static String getString();
}

3.然后点击Make Project会在build目录下生成.class文件

4.在app\src\main文件夹下新建一个jni文件夹,使用External Tools生成.h文件

  • 1.点击设置,找到Tools->External Tools->add->Create Tool
  • 2.具体配置如下:

    Name:javah
    Description:javah
    Program:$JDKPath$\bin\javah.exe
    Parameters:-classpath . -jni -d $ModuleFileDir$\src\main\jni $FileClass$
    Working directory:$ModuleFileDir$\src\main\Java


- classpath classes指明类所在的位置
- -d 产生的.h文件放到指定目录下

  • 3.配置玩后选相应的java文件,右键:External Tools -> javah
  • 4.然后main\jni目录下就会生成.h文件

5.生成.h文件内容如下:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_example_ynag_android00_MyJni */

#ifndef _Included_com_example_ynag_android00_MyJni
#define _Included_com_example_ynag_android00_MyJni
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_example_ynag_android00_MyJni
 * Method:    getString
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_example_ynag_android00_MyJni_getString
  (JNIEnv *, jclass);

#ifdef __cplusplus
}
#endif
#endif

6.在jni目录下新建一个C/C++source file,取名test.c,用来实现上面.h中的方法

#include "jni.h"
#include "com_example_ynag_android00_MyJni.h"

JNIEXPORT jstring JNICALL Java_com_example_ynag_android00_MyJni_getString
  (JNIEnv *env, jclass jz){
  return (*env)->NewStringUTF(env,"this is the first time for me to use jni");
  }

7.在jni文件夹下新建Android.mkApplication.mk文件

  • Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

LOCAL_MODULE := MyJni
LOCAL_SRC_FILES := test.c
include $(BUILD_SHARED_LIBRARY)
  • Application.mk
APP_ABI := all

8.关联下载好的ndk包

9.使用AS终端进入到jni目录,输入指令ndk-build就会生成相应的so文件(ndk-build需要自行配置)

10.添加的文件及生成的文件

🐉Error解决

  1. 忘记在那处会报错:# Error: Your project contains C++ files but it is not using a supported native build system.
  • 解决方案:
    app的build.gredle中添加如下代码即可:
sourceSets{
    main {
        jni.srcDirs = []
    }
}

具体位置:

🐉参考文档

1.生成.so文件:

  1. https://blog.csdn.net/leilifengxingmw/article/details/71598687
  2. https://www.jianshu.com/p/faa3eebbd401

2020-03-06 14:49:47 星期五

<wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">





posted @ 2020-03-06 14:52  记得按时恰饭  阅读(816)  评论(0编辑  收藏  举报