美文网首页
native-activity探索

native-activity探索

作者: 琼开心KingK | 来源:发表于2020-10-15 00:23 被阅读0次

    1背景

    据说游戏用native-activity性能更好,所以看看native-activity是什么。

    不熟悉ndk和cmake,单是编译就搞了很久,所以特此记录一下。

    其实native-activity看着还挺复杂的,组件、逻辑都需要自己封装,从零开始比较难。

    2参考资料

    1. Android NDK之二:创建NativeActivity

    https://www.cnblogs.com/liulipeng/p/3524423.html   

    2. Android中使用NativeActivity进行APP开发

    https://blog.csdn.net/var_rain/article/details/69934854# 

    3.官方sample源码

    https://github.com/android/ndk-samples/tree/master 

    4. 官方native-activity解析

    https://developer.android.google.cn/ndk/samples/sample_na.html?hl=zh-cn 

    5. Android实战技巧之三十五:了解native activity

    https://blog.csdn.net/lincyang/article/details/46474319

    6. Android——NativeActivity - C/C++ Apk开发

    https://www.cnblogs.com/chenxibobo/p/6867206.html 

    3简介

    资料1提到的,Android NDK为我们提供了两种方式来实现我们的native activity:

    1 native_activity.h

    2 android_native_app_glue.h

    方式二会简单一些。

    在使用方式一实现native activity时,需要注意在实现回调函数时,不要阻塞了main UI thread,否则会出现ANR。

    而方式二中,则在一个新线程中创建一个事件循环执行回调函数,因此不会造成main UI thread阻塞。

    4方法一:引用native-activity

    参考资料2,源码缺少绘制部分,所以我暂时未实践。

    5方法二:引用android_native_app_glue

    5.1编译

    资料3官方源码采用Android Studio的版本比较高,而且用的是cmake,调整版本信息也没有编译成功。

    官方说ndk参考other-builds/ndkbuild/native-activity,修改一通后,也没编译成功。

    资料4的sample源码来自ndk_r10,资料5的来自ndk_r8,但是官网只能下载到的最久远的是ndk_r12,里面没有sample。

    最后,在官方源码的废弃branch里面找到旧版的ndk方式编译的源码

    链接:https://github.com/android/ndk-samples/tree/master-ndkbuild 

    旧版在新版AS上也不能直接编译,一通修改终于搞定。

    1) 环境:

    (1). Jdk: 1.8.0

    (2). Android Studio: 3.4

    (3). Android Sdk: 19, 24, 27, 28, 29

    (4). Android Ndk: 19.2.5345600

    (5). Android build tools: 28.0.3

    (6). Gradle: 5.1.1-all

    (7). Gradle build tools: 3.4.0

    2) 根目录的build.gradle

    jcenter()后面添加google(),不然有的工具不能自动下载

    classpath 'com.android.tools.build:gradle:2.3.0'改为3.4.0

    3) App目录的build.gradle

    compileSdkVersion 23改为28

    buildToolsVersion '25.0.0'改为'28.0.3'

    minSdkVersion 14改为19

    targetSdkVersion 14改为28

    path 'src/main/cpp/Android.mk'改为path 'src/main/jni/Android.mk'

    4)gradle-wrapper.properties

    改为gradle-5.1.1-all.zip

    5) AndroidManifest.xml

    删除<uses-sdk android:minSdkVersion="9" />

    6) 关键一步:编译so

    把src/main/cpp目录改名为jni

    然后cmd窗口进入到jni目录下,进行ndk-build,

    先编译出libnative-activity.so,在libs目录下

    Ndk好像只认jni目录,其他名字,报错信息如下:

    Android NDK: Could not find application project directory !

    Android NDK: Please define the NDK_PROJECT_PATH variable to point to it.

    [if !supportLists]7) [endif]第二步:AS下build 或者gradlew.bat build

    如果第3)没有做好,编译失败之后才修改的,就先clean project,之后再重新编译。

    5.2分析

    AndroidManifest.xml中设置了android:hasCode设为 false,是指没有java代码。但是还是需要在java虚拟机中运行,才能跟其他进程交互,Manifest里面的activity android:name="android.app.NativeActivity"解决了这个问题。虽然我们没有自定义activity继承activity,没有java代码,但是指定了framework的原生NativeActivity。

    相关文章

      网友评论

          本文标题:native-activity探索

          本文链接:https://www.haomeiwen.com/subject/zmagpktx.html