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。
网友评论