native-activity探索

2020-10-15  本文已影响0人  琼开心KingK

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。

上一篇下一篇

猜你喜欢

热点阅读