Android NDK系列(二)NativeActivity工作流程

    在Android NDK系列(一)手动搭建Native Project 已经介绍了如何手动搭建一个基于NativeActivity的工程,本文主要介绍NativeActivity的工作流程,通过本文的学习,可以了解到NativeActivity是如何与Native层交互的,Native的NativeWindow是从哪里来的。下面从NativeActivity的源码开始了解它的工作流程。

1、NativeActivity概览

    NativeActivity是Framework中的一个类,路径为frameworks\base\core\java\android\appNativeActivity.java,类的继承关系如下。

public class NativeActivity extends Activity implements SurfaceHolder.Callback2,
        InputQueue.Callback, OnGlobalLayoutListener {
    static class NativeContentView extends View {
        NativeActivity mActivity;

        public NativeContentView(Context context) {
            super(context);
        }

        public NativeContentView(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    }
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        mNativeContentView = new NativeContentView(this);
        setContentView(mNativeContentView);
	}
}

    从NativeActivity类的定义可以看出,它也继承于Activity,在onCreate回调中将NativeContentView作为内容视图。

JNI层有一个android_app_NativeActivity.cpp与NativeActivity.对应,路径为

frameworks\base\core\jni\android_app_NativeActivity.cpp。

    在NativeActivity类中定义了一些native方法,调用这些方法可以与android_app_NativeActivity交互,比如调用NativeActivity的loadNativeCode,相应地android_app_NativeActivity.cpp的loadNativeCode_native会被调用。

    

2、加载本地代码

    在onCreate回调中开始加载本地代码,如下所示。

public class NativeActivity extends Activity implements SurfaceHolder.Callback2,
        InputQueue.Callback, OnGlobalLayoutListener {
    protected void onCreate(Bundle savedInstanceState) {
	    String libname = "main";
        String funcname = "ANativeActivity_onCreate";
		
            ai = getPackageManager().getActivityInfo(
                    getIntent().getComponent(), PackageManager.GET_META_DATA);
            if (ai.metaData != null) {
                String ln = ai.metaData.getString(META_DATA_LIB_NAME);
                if (ln != null) libname = ln;
                ln = ai.metaData.getString(META_DATA_FUNC_NAME);
                if (ln != null) funcname = ln;
            }
        mNativeHandle = loadNativeCode(path, funcname, Looper.myQueue(),
                getAbsolutePath(getFilesDir()), getAbsolutePath(getObbDir()),
                getAbsolutePath(getExternalFilesDir(null)),
                Build.VERSION.SDK_INT, getAssets(), nativeSavedState,
                classLoader, classLoader.getLdLibraryPath());
	}
}

    在onCreate中,主要解析Activity配置的libname,比如下面的示例配置的libname为native。

    <activity
      android:name

相关推荐

  1. Android NDK系列NativeActivity工作流程

    2024-05-25 21:31:03       37 阅读
  2. 测试的工作流程

    2024-05-25 21:31:03       57 阅读
  3. GIT工作流程总结

    2024-05-25 21:31:03       51 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-05-25 21:31:03       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-05-25 21:31:03       101 阅读
  3. 在Django里面运行非项目文件

    2024-05-25 21:31:03       82 阅读
  4. Python语言-面向对象

    2024-05-25 21:31:03       91 阅读

热门阅读

  1. OSI七层模型和TCP/IP四层模型的区别

    2024-05-25 21:31:03       28 阅读
  2. 什么是高精度定位平板?

    2024-05-25 21:31:03       33 阅读
  3. HTTP 和高级编程

    2024-05-25 21:31:03       28 阅读
  4. 前后端分离的好处

    2024-05-25 21:31:03       34 阅读
  5. 基于Python的招聘岗位数据分析系统的设计与实现

    2024-05-25 21:31:03       37 阅读
  6. 1.4 接入网和物理媒体

    2024-05-25 21:31:03       30 阅读