2024年最全【Android-NDK】(一)cmake构建项目,安卓内存优化面试题

《设计思想解读开源框架》

第一章、 热修复设计

  • 第一节、 AOT/JIT & dexopt 与 dex2oat

  • 第二节、 热修复设计之 CLASS_ISPREVERIFIED 问题

  • 第三节、热修复设计之热修复原理

  • 第四节、Tinker 的集成与使用(自动补丁包生成)

    第二章、 插件化框架设计

  • 第一节、 Class 文件与 Dex 文件的结构解读

  • 第二节、 Android 资源加载机制详解

  • 第三节、 四大组件调用原理

  • 第四节、 so 文件加载机制

  • 第五节、 Android 系统服务实现原理

    第三章、 组件化框架设计

  • 第一节、阿里巴巴开源路由框——ARouter 原理分析

  • 第二节、APT 编译时期自动生成代码&动态类加载

  • 第三节、 Java SPI 机制

  • 第四节、 AOP&IOC

  • 第五节、 手写组件化架构

    第四章、图片加载框架

  • 第一节、图片加载框架选型

  • 第二节、Glide 原理分析

  • 第三节、手写图片加载框架实战

    第五章、网络访问框架设计

  • 第一节、网络通信必备基础

  • 第二节、OkHttp 源码解读

  • 第三节、Retrofit 源码解析

    第六章、 RXJava 响应式编程框架设计

  • 第一节、链式调用

  • 第二节、 扩展的观察者模式

  • 第三节、事件变换设计

  • 第四节、Scheduler 线程控制

    第七章、 IOC 架构设计

  • 第一节、 依赖注入与控制反转

  • 第二节、ButterKnife 原理上篇、中篇、下篇

  • 第三节、Dagger 架构设计核心解密

    第八章、 Android 架构组件 Jetpack

  • 第一节、 LiveData 原理

  • 第二节、 Navigation 如何解决 tabLayout 问题

  • 第三节、 ViewModel 如何感知 View 生命周期及内核原理

  • 第四节、 Room 架构方式方法

  • 第五节、 dataBinding 为什么能够支持 MVVM

  • 第六节、 WorkManager 内核揭秘

  • 第七节、 Lifecycles 生命周期


    本文包含不同方向的自学编程路线、面试题集合/面经、及系列技术文章等,资源持续更新中…

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

variable. Because CMake includes system libraries in the search path by

default, you only need to specify the name of the public NDK library

you want to add. CMake verifies that the library exists before

completing its build.

从系统查找依赖库

find_library( # Sets the name of the path variable.
#log日志库
log-lib

Specifies the name of the NDK library that

you want CMake to locate.

log )

Specifies libraries CMake should link to your target library. You

can link multiple libraries, such as libraries you define in this

build script, prebuilt third-party libraries, or system libraries.

库的依赖

target_link_libraries( # Specifies the target library.
native-lib

Links the target library to the log library

included in the NDK.

${log-lib} )

  1. native-lib.cpp

#include <jni.h>
#include

extern “C” JNIEXPORT jstring JNICALL
Java_com_kongge_ndktest_MainActivity_stringFromJNI(
JNIEnv* env,
jobject /* this */) {
std::string hello = “Hello from C++”;
return env->NewStringUTF(hello.c_str());
}

  1. build.gradle


android {
defaultConfig {
externalNativeBuild {
cmake {
cppFlags “” // 命令参数,非必须
}
}
}

externalNativeBuild {
cmake {
path “src/main/cpp/CMakeLists.txt” // 指定了该文件的路径,必须
version “3.10.2” // 支持的最低版本,非必须
}
}
}

5.构建或者运行之后,会生成对应的so文件
image

三:现有项目手动集成NDK

  1. 创建存放c文件的目录

src/mian 目录上右键->new->Directory->jni,创建c文件,我这里创建DataEncryption.cpp
image

  1. 新建CMakeLists.txt

这个位置可以随意放,我是在app根目录或者module的根目录创建的CMakeLists.txt文件,后面可以在build.gradle里面配置路径。
image

CMakeLists.txt内容如下:

cmake_minimum_required(VERSION 3.4.1)

add_library(DataEncryptionLib SHARED src/main/jni/DataEncryption.cpp )

  1. 在build.gradle中配置CMakeLists.txt的路径。

app根目录或者module根目录下的build.gradle中配置:

android {

externalNativeBuild {
cmake {
// 路径是ModuleName/CMakeLists.txt,则path ‘CMakeLists.txt’
// 如果路径是ModuleName/src/main/cpp/CMakeLists.txt,则path ‘src/main/cpp/CMakeLists.txt’
path ‘CMakeLists.txt’
}
}
}

  1. 新建java文件,用于调用so方法。

image

package com.kongge.dataencryption.util;

public class DataEncryptionUtil {

static {
System.loadLibrary(“DataEncryptionLib”);
}

// 加密
public static String encryptData(String data) {
return encryptString(data);
}

// 解密
public static String decryptData(String data) {
return decryptString(data);
}

private static native String encryptString(String string);

private static native String decryptString(String string);
}

  1. 此时native里面的方法是红色的,Alt+Enter会提示"Create function Java_xxx",会自动创建头文件。也可以使用javah来创建头文件,将头文件放到jni目录下。

com_kongge_dataencryption_util_DataEncryptionUtil.h内容如下

/* DO NOT EDIT THIS FILE - it is machine generated /
/
Header for class com_kongge_dataencryption_util_DataEncryptionUtil */

#ifndef _Included_com_kongge_dataencryption_util_DataEncryptionUtil
#define _Included_com_kongge_dataencryption_util_DataEncryptionUtil

#include “…/…/…/…/…/…/…/AndroidSdk/ndk/21.1.6352462/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/include/jni.h”

#ifdef __cplusplus
extern “C” {
#endif
/*

  • Class: com_kongge_dataencryption_util_DataEncryptionUtil
  • Method: encryptString
  • Signature: (Ljava/lang/String;)Ljava/lang/String;
    */
    JNIEXPORT jstring JNICALL Java_com_kongge_dataencryption_util_DataEncryptionUtil_encryptString
    (JNIEnv *, jclass, jstring);

/*

  • Class: com_kongge_dataencryption_util_DataEncryptionUtil
  • Method: decryptString
  • Signature: (Ljava/lang/String;)Ljava/lang/String;
    */
    JNIEXPORT jstring JNICALL Java_com_kongge_dataencryption_util_DataEncryptionUtil_decryptString
    (JNIEnv *, jclass, jstring);

#ifdef __cplusplus
}
#endif
#endif

  1. 修改DataEncryption.cpp文件

#include
#include <jni.h>
#include “com_kongge_dataencryption_util_DataEncryptionUtil.h”

/*

  • Class: com_kongge_dataencryption_util_DataEncryptionUtil
  • Method: encryptString
  • Signature: (Ljava/lang/String;)Ljava/lang/String;
    /
    JNIEXPORT jstring JNICALL Java_com_kongge_dataencryption_util_DataEncryptionUtil_encryptString
    (JNIEnv env, jclass obj, jstring data) {
    const char
    str;
    jboolean b = false;
    str = env->GetStringUTFChars(data, &b);
    if(str == NULL) {
    return NULL; /
    OutOfMemoryError already thrown */
    }
    char strArr[strlen(str)];
    strcpy(strArr, str);
    int i = 0;
    while(strArr[i] != ‘\0’) {
    strArr[i] = strArr[i] + 1;
    i++;
    }
    env->ReleaseStringUTFChars(data, str);
    jstring rtstr = env->NewStringUTF(strArr);
    return rtstr;
    }

总结

本文讲解了我对Android开发现状的一些看法,也许有些人会觉得我的观点不对,但我认为没有绝对的对与错,一切交给时间去证明吧!愿与各位坚守的同胞们互相学习,共同进步!

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

本文讲解了我对Android开发现状的一些看法,也许有些人会觉得我的观点不对,但我认为没有绝对的对与错,一切交给时间去证明吧!愿与各位坚守的同胞们互相学习,共同进步!

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 26
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值