Android Studio将jni代码模块化

本例源码下载地址:ModuleDemo

简介:

当我们的app代码量越来越多时,难免会有一些希望抽出来共用的代码,这时就需要将其封装成库提供给其他应用使用。
库可以以传统jar包的形式提供出来,也可以用aar的形式提供。不同的是,jar形式只能包含java代码,而aar形式的库则可以包含Android资源和一个清单文件包括相应的C/C++代码,这样可以绑定布局和可绘制对象等共享资源。

以下用一个具体的例子来开发一个jni模块(相关jni开发请参考前篇文章Android Jni开发-实战篇(CMake))。该模块只要包含一个测试页面,以及一些C++封装的代码。

为了方便,我们直接用上次写好的JniDemo工程来将其改成jni-demo.aar库。

  • 打开JniDemo工程,找到build.gradle,将apply plugin中的application改为library。

Android Studio将jni代码模块化

  • 去掉defaultConfig中的applicationId,同时为了预防在其他工程中出现2个MainActivity不好区分,我们把页面Activity名称改为JniDemoActivity,把其他不需要的属性去掉。
  • Android Studio将jni代码模块化
    Android Studio将jni代码模块化
  • 之后再Build->RebuildProject就可以生成aar了,生成的aap路径在工程目录下\app\build\outputs\aar。
  • Android Studio将jni代码模块化
    Android Studio将jni代码模块化
  • 如果需要release版本的话,可以在打开build->Select Build
    Variants,然后在左侧窗口下选择release再重新rebuild就可以了。

    Android Studio将jni代码模块化
    Android Studio将jni代码模块化

这样一样完整的.aar库生成就完成了。是不是很简单?以下是在新工程中对.aar库的使用。

  • 创建新工程ImportModuleDemo并引入使用aar文件,我们将刚才生成的app-debug.aar文件改名为jni-module.aar。然后将其复制到新建工程的libs目录(切换到project视图下才能看到libs目录,不切换的话直接在文件管理那里将.aar文件直接放入也可以)。
    Android Studio将jni代码模块化
  • 打开file->new Module,拉到最下面,选择import .jar/.aar package选项,在下个页面中选择刚才放的jni-module.aar目录,然后finish。
    Android Studio将jni代码模块化
    Android Studio将jni代码模块化
  • 点击finish后切换到Android视图可以清楚地看到新引入的jni-module模块。
    Android Studio将jni代码模块化
  • 在新工程的settings.gradle文件可以看到include里面多了引入的jni-module声明
  • Android Studio将jni代码模块化
  • 光是这样还不足以使用jni-module模块,还需要在build.gradle中添加jni-module模块的依赖。
    Android Studio将jni代码模块化
  • 最后就可以在ImportModuleDemo工程中任意地方使用jni-module的类、方法及ui界面了。
// 静态加载jni-module中的demo-lib库
static {
    System.loadLibrary("demo-lib");
}
TextView tv_result;
Button btn_test;
Button btn_intent2Test;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    tv_result = findViewById(R.id.tv_result);
    btn_test = findViewById(R.id.btn_test);
    btn_intent2Test = findViewById(R.id.btn_intent2Test);

    btn_test.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // 使用jni-module库中的Demo类及方法计算结果
            Demo demo = new Demo();
            int result = demo.sum(1,1);
            tv_result.setText(""+result);
        }
    });

    btn_intent2Test.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // 使用jni-module库中的JniDemoActivity界面
            Intent intent = new Intent(MainActivity.this, JniDemoActivity.class);
            startActivity(intent);
        }
    });
}

由于jni-module涉及到jni,需要注意在使用的地方静态加载相应的库。

  • 最后看看运行效果:
    Android Studio将jni代码模块化