最近项目中用到ndk camera,因此,学习了一下Google所提供的ndk sample。
sample中有两个module,分别是basic和texture-vIEw。texture-vIEw module将texturevIEw作为传参,传入ndk camera。而basic module通过androID_native_app_glue框架绑定对应Activity,无需传入控件作为参数。
两者各有优点,texture-vIEw更通俗易懂。但最终由于项目接口定义的原因(无控件参数传入),选用了androID_native_app_glue框架进行开发。
如何使用使用androID_native_app_glue框架时,需要在Native和Java两端分别实现部分功能。
JAVA上层需要实现的较为简单。仅需要创建一个继承于NativeActivity的Activity,并在Manifest.xml中将其与SDK中的某一动态库进行绑定即可。
(1)创建Activity
public class MainActivity extends NativeActivity { @OverrIDe protected voID onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentVIEw(R.layout.activity_main); }}
(2)绑定
<?xml version="1.0" enCoding="utf-8"?><manifest xmlns:androID="http://schemas.androID.com/apk/res/androID" package="com.breakloop.ndkcamera"> <uses-permission androID:name="androID.permission.CAMERA" /> ... <application androID:allowBackup="true" androID:icon="@mipmap/ic_launcher" androID:label="@string/app_name" androID:roundIcon="@mipmap/ic_launcher_round" androID:screenorIEntation="sensorLandscape" androID:supportsRtl="true" androID:theme="@style/Apptheme"> <activity androID:name=".MainActivity"> <Meta-data androID:name="androID.app.lib_name" androID:value="native-lib" /> <intent-filter> <action androID:name="androID.intent.action.MAIN" /> <category androID:name="androID.intent.category.LAUNCHER" /> </intent-filter> </activity> .... </application></manifest>
其中,androID.app.lib_name指定了sdk中动态库的名称。
Native(1)实现extern "C" voID androID_main(struct androID_apP* state)方法
在任意cpp文件中实现该方法,本文在androID_main1.cpp中实现。androID_main1的大致框架如下。
#include <androID_native_app_glue.h>extern "C" voID androID_main(struct androID_apP* state) { state->userData = state; //(1)指定cmd处理方法 state->onAppCmd = ProcessAndroIDCmd; // loop waiting for stuff to do. while (1) { // Read all pending events. int events; struct androID_poll_source* source; while (ALooper_pollAll(0, NulL, &events, (voID**)&source) >= 0) { // Process this event. if (source != NulL) { source->process(state, source); } // Check if we are exiting. if (state->destroyRequested != 0) { LOGI("CameraEngine thread destroy requested!"); //(2)Todo 析构 return; } } //(3)Todo:画帧 }}static voID ProcessAndroIDCmd(struct androID_apP* app, int32_t cmd) { switch (cmd) { case APP_CMD_INIT_WINDOW: //Todo INIT WINDOW break; case APP_CMD_TERM_WINDOW: //Todo TERMINATE WINDOW break; case APP_CMD_CONfig_CHANGED: //Todo CONfig CHANGED break; case APP_CMD_LOST_FOCUS: //Todo FOR LOST FOCUS break; }}
(2)引入androID_native_app_glue框架
在CMakeList.txt中配置完成,无需编程。先看一下整体的CMakeList内容。
cmake_minimum_required(VERSION 3.4.1)//(1)引入native_app_glue框架头文件所在目录include_directorIEs(${ANDROID_NDK}/sources/androID/native_app_glue ${COMMON_SOURCE_DIR})//(2)将androID_native_app_glue.c封装成app_glue静态库,否则在创建activity时,会crashadd_library(app_glue STATIC ${ANDROID_NDK}/sources/androID/native_app_glue/androID_native_app_glue.c)//(3)暴露ANativeActivity_onCreate方法,否则在创建activity时,会crashset(CMAKE_SHARED_linkER_FLAGS "${CMAKE_SHARED_linkER_FLAGS} -u ANativeActivity_onCreate")//(4)将androID_main1封装至动态库native-lib中,而native-lib将在Manifest中被指定。androID_main1实现了方法androID_main。add_library( # Sets the name of the library. native-lib # Sets the library as a shared library. SHARED # ProvIDes a relative path to your source file(s). native-lib.cpp ... androID_main1.cpp )find_library( # Sets the name of the path variable. log-lib # SpecifIEs the name of the NDK library that # you want CMake to locate. log)//(5)一定要引入步骤(2)中封装的app_glue,否则创建activity时,将crashtarget_link_librarIEs( # SpecifIEs the target library. native-lib -landroID camera2ndk mediandk GLESv2 app_glue # links the target library to the log library # included in the NDK. ${log-lib})
结尾遵循以上步骤,androID_native_app_glue框架便可正常使用了。
由于Todo部分尚未完成,启动时,整个界面为黑色。
Todo部分与NDK Camera相关,想使用androID_native_app_glue框架的开发人员必定不会陌生,本文不再详述。
总结以上是内存溢出为你收集整理的android_native_app_glue框架使用流程全部内容,希望文章能够帮你解决android_native_app_glue框架使用流程所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)