猿问
下载APP

请问该如何开发 native-activity 工程?

如何开发 native-activity 工程


守着星空守着你
浏览 71回答 4
4回答

万千封印

在Android2.3版本里,可以使用native_activity.h接口实现一个完整的native activity,在使用的时候,要确认回调函数不能阻塞主UI线程。Native_app_glue静态辅助库为另一个线程中的事件循环提供了回调,而且非常容易使用,可以参考native-activity示例程序。首先,在Eclipse中创建一个android项目,在项目的根目录下新建一个jni目录用于存放所有的本地代码。其次是native-activity/AndroidManifest.xml 文件内容:123456789101112131415161718192021222324252627282930313233343536373839404142434445464748<?xml&nbsp;version="1.0"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;encoding="utf-8"?>&nbsp;<!--&nbsp;BEGIN_INCLUDE(manifest)&nbsp;-->&nbsp;<manifest&nbsp;xmlns:android="http://schemas.android.com/apk/res/android"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;package="com.example.native_activity"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;android:versionCode="1"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;android:versionName="1.0">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<!--&nbsp;This&nbsp;is&nbsp;the&nbsp;platform&nbsp;API&nbsp;where&nbsp;NativeActivity&nbsp;was&nbsp;introduced.&nbsp;-->&nbsp;&nbsp;&nbsp;&nbsp;<!--&nbsp;本地活动将引入的平台&nbsp;API&nbsp;-->&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<uses-sdk&nbsp;android:minSdkVersion="8"&nbsp;/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<!--&nbsp;This&nbsp;.apk&nbsp;has&nbsp;no&nbsp;Java&nbsp;code&nbsp;itself,&nbsp;so&nbsp;set&nbsp;hasCode&nbsp;to&nbsp;false.&nbsp;-->&nbsp;&nbsp;&nbsp;&nbsp;<!--&nbsp;该&nbsp;.apk&nbsp;没有&nbsp;Java&nbsp;代码,所以设置&nbsp;hasCode&nbsp;属性值为假&nbsp;-->&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<application&nbsp;android:label="@string/app_name"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;android:hasCode="false">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<!--&nbsp;Our&nbsp;activity&nbsp;is&nbsp;the&nbsp;built-in&nbsp;NativeActivity&nbsp;framework&nbsp;class.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;This&nbsp;will&nbsp;take&nbsp;care&nbsp;of&nbsp;integrating&nbsp;with&nbsp;our&nbsp;NDK&nbsp;code.&nbsp;-->&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<!--&nbsp;我们的活动是内置本地活动框架类。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这将处理使我们的&nbsp;NDK&nbsp;代码成为一体。&nbsp;-->&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<activity&nbsp;android:name="android.app.NativeActivity"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;android:label="@string/app_name"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;android:configChanges="orientation|keyboardHidden">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<!--&nbsp;Tell&nbsp;NativeActivity&nbsp;the&nbsp;name&nbsp;of&nbsp;or&nbsp;.so&nbsp;-->&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<!--&nbsp;告知本地活动共享库的名字&nbsp;-->&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<meta-data&nbsp;android:name="android.app.lib_name"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;android:value="native-activity"&nbsp;/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<intent-filter>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<action&nbsp;android:name="android.intent.action.MAIN"&nbsp;/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<category&nbsp;android:name="android.intent.category.LAUNCHER"&nbsp;/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</intent-filter>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</activity>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</application>&nbsp;</manifest>&nbsp;<!--&nbsp;END_INCLUDE(manifest)&nbsp;-->

繁星点点滴滴

在Android2.3版本里,可以使用native_activity.h接口实现一个完整的native activity,在使用的时候,要确认回调函数不能阻塞主UI线程。Native_app_glue静态辅助库为另一个线程中的事件循环提供了回调,而且非常容易使用,可以参考native-activity示例程序。首先,在Eclipse中创建一个android项目,在项目的根目录下新建一个jni目录用于存放所有的本地代码。其次是native-activity/AndroidManifest.xml 文件内容

蓝山帝景

React native充分利用了Facebook的现有轮子,是一个很优秀的集成作品,并且我相信这个团队对前端的了解很深刻,否则不可能让Native code「退居二线」。对应到前端开发,整个系统结构是这样:JSX vs HTMLCSS-layout vs cssECMAScript 6 vs ECMAScript 5React native View vs DOM无需编译,我在第一次编译了ipa装好以后,就再也没更新过app,只要更新云端的js代码,reload一下,整个界面就全变了。多数布局代码都是JSX,所有Native组件都是标签化的,这对于前端程序员来说,降低了不少学习成本,也大大减少了代码量。不信你可以看看JSX编译后的代码。复用React系统,也减少了一定学习和开发成本,更重要的是利用了React里面的分层和diff机制。js层传给Native层的是一个diff后的json,然后由Native将这个数据映射成真正的布局视图。css-layout也是点睛之笔,前端可以继续用熟悉的类css方式来编写布局,通过这个工具转换成constrain布局。系统只有js-objc的单向调用,就是把原生UI组件的方法通过javascritcore或者webview(低版本iOS)映射到js中来,整个调用过程是异步的,这样的设计令React native可以让js运行在桌面chrome中,通过websocket连接Native code和桌面chrome,极大地方便了调试。对其中的机制Bang的一篇文章写得很详细,我就不拾人牙慧了:React Native通信机制详解 laquo; &nbsp;bang’s blog 。但这样设计也会带来一些问题,后面说。点按操作也被抽象成了一组组件(TouchableXXX),这种抽象方式是我在之前做类似工作中没有想到的。facebook还列出Native为什么和web「手感」不同的原因:实时的点按反馈和取消能力。React Native 这套相应机制设计得很完善,能像Native code那样控制整个点按操作的所有过程。Debug相当方便!修改了js以后,通过内建的nodejs watcher编译成bundle,在模拟器里面按cmd+r就可以看到效果。而且按cmd+d,可以打开一个chrome窗口,所有的js都移到了chrome里面运行,所以什么断点单步打调用栈,都不在话下。上面的既是特点也是优点,下面说说缺点,或者应该说:「仍然遗留的问题」,在我看来,这个方案已经超越了Hybird方案。系统仍然(不得不)依赖原生组件暴露出来的组件和方法。举两个例子,ScrollView这个组件,在Native层是有大量事件的,scrollViewWillBeginDragging, scrollViewWillEndDragging,scrollViewDidEndDragging等等,这些事件在现有的版本都没有暴露,基本上做不了组件联动效果。另外,这个版本中有大量组件是iOS only的:ActivityIndicatorIOS、DatePickerIOS、NavigatorIOS、PickerIOS、SliderIOS、SwitchIOS、TabBarIOS、AlertIOS、AppStateIOS、LinkingIOS、PushNotificationIOS、StatusBarIOS、VibrationIOS,反过来看,剩余的都是一些抽象程度极强的基本组件。这样,用户必须在不同的下写两套代码,而且所有能力仍然强烈依赖 React native 开发人员暴露的接口。由于最外层是React,初次学习成本高,不像往常的Hybird方案,只要多学几个JS API就可以开始干活了。当然,React的确让后续开发变得简单了一些,这么一套外来的(基于iOS)、残缺不全的(css-layout)在React的包装下,的确显得不那么面目可憎了。另外,React Native仍然很不完善。文档还不全,我基本上是看着他的示例代码完成的demo,集成到已有app的文档也是今天才出来。按照官方的说法,Android版本要到半年后才发布:Blog | React ,届时整个系统设计可能还会有很大的变化。PS,在使用Tabbar的时候,我惊喜的发现他们居然用了iconfont方案,我现在手头的项目中也有同样的实现,不过API怎么设计一直很头疼。结果,我发现他是这么写的:<TabBarItemIOSname="blueTab"icon={_ix_DEPRECATED('favorites')}.>在 _ix_DEPRECATED 的定义处,有一句注释: // TODO(nicklockwood): How can this fit our require system?以上。下面是一周前,在React native还没开源的时候,通过反解ipa的一些分析过程,有兴趣的可以看看。------------------------简单粗暴的分割线--------------------背景和调研手段React Native还没开源,最近和组里兄弟「反编译」了Facebook Group(这个应用是用React Native实现的)的ipa代码,出来几百个JS文件,格式化一下,花了几天时间读了一下源码,对React Native的内部核心机制算是有了一个基本了解。React Native的核心实现:先简单说几点,详细的等回头更新。React Native里面没有webview,这货不是Hybrid app,里面执行JS是用的JavascriptCore。2. 再说React Native的核心,iOS Native code提供了十来个最基本核心的类(RCTDeviceEventEmitter、RCTRenderingPerf等)、或组件(RCTView、RCTTextField、RCTTextView、RCTModalFullscreenView等),然后由React Native的JS部分,组成二十来个基本组件(Popover、Listview等),交由上层的业务方来使用(THGroupView)。3. 就如他们在宣传时所说,他们实现了一套类似css的子集,用来解决样式问题,相当复杂和强大,靠这个才能将Native的核心组件组成JS层的基本组件再组成业务端的业务组件,应该是采用facebook/css-layout · GitHub的C语言版本实现的(在ppt中我们看到了类似flex-direction: column一类的代码,这个正是css-layout支持的语法)。4. 在React Native中,写JS的工程师解决的是「将基本组件拼装成可用的React组件」的问题,写Native Code的工程师解决的是「提供核心组件,提供足够的扩展性、灵活性和性能」的问题。React Native的设计考虑:ReactJS对React Native有着直接的影响(我没在生产环境中用过React,只看过代码用过Angular,如果有误请指出)ReactJS里面有这样的设计:ReactJS 的大工厂入口createElement返回的不是某个实体DOM对象,而只是一个数组2. 通过源码中 ui/browser/ 目录中的代码,将这个数组转换成DOM3. 底层的渲染核心是可以更换的另外,Facebook自己有JSX,css-layout等开源项目,基于这些,如果要做一个用 JS来开发Native app的东西,很自然就想到了一套最有效率的搞法:将 ui/browser 里面的代码替换成一套 Native 的桥接JS(实际上,iOS版是通过injectGenericComponentClass方法,将核心组件的方法注入到JS里面 ),就直接复用React的MVVM,自动将数据映射到Native了2. Native code里面实现三组核心API,一组提供核心组件的API(create、update、delete),一组事件方法(ReactJS里面的EventEmitter ),一组对css进行解析(css-layout)以及返回Style的ComputedStyle(React Native里面叫meatureStyle)。这样,用上了ReactJS本身的所有核心功能和设计思路,Native的开发也足够简单。那,React Native是什么看其实这东西从Native开发来说,相当于重新发明了一个浏览器渲染引擎并且套一个React的壳,从Web开发角度来说,就是把原来React的后端换成了Native code来实现,就跟Flipboard最近搞的React Canvas 一样: Flipboard · GitHubreact-canvasReact Native的优势和劣势::优势相对Hybird app或者Webapp:不用Webview,彻底摆脱了Webview让人不爽的交互和性能问题2. 有较强的扩展性,这是因为Native端提供的是基本控件,JS可以自由组合使用3. 可以直接使用Native原生的「」动画(在FB Group这个app里面,面板滑出带一点果冻弹动,面板基于某个点展开这种动画随处可见,这种动画用Native code来做小菜一碟,但是用Web来做就难上加难)。优势相对于Native app:可以通过更新远端JS,直接更新app,不过这快成为各家大型Native app的标配了…劣势:扩展性仍然远远不如web,也远远不如直接写Native code(这个不用废话解释了吧)2. 从Native到Web,要做很多概念转换,势必造成双方都要妥协。比如web要用一套CSS的阉割版,Native通过css-layout拿到最终样式再转换成native原生的表达方式(比如iOS的Constraint\origin\Center等属性),再比如动画。另外,若Android和iOS都要做相同的封装,概念转换就更复杂了。更新1:添加了React对React Native的影响。更新2:基本确定其使用了 css-layout,添加了对React Native的总结更新3: React native已经开源了: React Native,只有iOS版。我写了几个demo,简单看了看objc代码并和开源前的我们的一些结论(见后文)交叉验证。简单地从前端工程师和系统整体角度说一下React native的特点和优劣吧。更新4: 补充了几条优势和与前端开发的对照

月关宝盒

android ndk开发经常遇到了动态库的问题,本文主要介绍:① 动态链接库的生成;② 在Java和C混合编程的情况下如何调用第三方动态链接库;③ 使用dlopen程序运行时直接调用;④ 纯c的方式开发调用;本文重点推荐②和④,第③中太麻烦每个函数都需要dlsym调用一次;工具/原料Win8.1 x64adt-bundle-windows-x86_64-20140702android-ndk-r10d生成动态库1android ndk下面生成动态库so文件的方法很多,但是这里只提供一种方法,更多的生成方法可以看,“ndk 编译静态库”:2fkAdd.c 的内容如下:#include <jni.h>int fkAdd(int nX, int nY){return nX + nY;}3Android.mk 的内容如下:LOCAL_PATH:= $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE:= fkAddLOCAL_SRC_FILES:= fkAdd.cinclude $(BUILD_SHRRED_LIBRARY)41、打开 eclipse2、点击 文件3、点击 新建4、点击 other...51、展开 Android 选项;2、选择 Android Project from Existing Code;3、点击 Next61、输入 Root Director;2、取消 tests;3、选中 Copy projects into workspace;4、点击 Finish;71、右键工程;2、选择 Android Tools;3、Add Native Support...;8点击 Finish9修改android sdk 版本为 4.0.3;关于如何修改 android sdk 版本:10修改 Min SDK version:15修改 Target SDK version:19步骤阅读11在jni目录下面新建文件fkAdd.c 的内容如下:int fkAdd(int nX, int nY){return nX + nY;}12临时修改 Android.mk 文件内容如下:
打开App,查看更多内容
随时随地看视频慕课网APP
我要回答