使用AS的NDK工具开发JNI

从集成NDK至AndroidStudio中到实现简单案例

  1. Ctrl Alt Shift S 快捷键打开如下窗口,点击Download Android NDK.

    这里写图片描述

  2. 如下图,NDK会自动下载安装好

    这里写图片描述

  3. NDK下载好后配置下系统环境变量,方便编译.so库

    这里写图片描述

    如下可执行 ndk-build 命令即可

    这里写图片描述

    在这里 ndk-build 就是将 C/C++文件编译成 .so库的命令工具。当我们在没有 jni文件夹的地方运行该命令,就会出现如上的结果;正确的使用情景是在有 jni文件夹的地方使用该命令,并且 jni文件夹内拥有 Android.mk、Application.mk、xxx.cpp 文件,其中前两个文件名是固定的,后面的 .cpp文件就是自己编写的 C/C++文件了

    这里写图片描述

    然后在项目的app/src/main下创建jniLibs目录,将生成好的 .so库置入其中

  4. 避坑动作

    1. 在项目的 gradle.properties文件中添加 Android.useDeprecatedNdk=true,不然

    这里写图片描述

    1. 在 build.gradle文件中添加 sourceSets

      android {
          
          ......
      
      	buildTypes {
              release {
      
      			......            
      
              }
      
              sourceSets {
                  main {
                      jni.srcDirs = []
                  }
              }
          }
      }
      
  5. 看看代码

    1. 在 Activity 中调用 .so库写好的方法

      public class OneActivity extends AppCompatActivity {
         
      	// 静态加载本地.so库   
          static {
              System.loadLibrary("jni-test");
          }
      
          @BindView(R.id.tv_fromC)
          TextView tvFromC;
      
          @Override protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.activity_one);
              ButterKnife.bind(this);
             
              // 将本地方法返回的字符串显示到页面
              tvFromC.setText(getStr());
          }
      
      	// 声明本地方法
          public native String getStr();
      }
      
    2. C/C++写好的本地方法

      #include <jni.h>
      #include <stdio.h>
      
      #ifdef __cplusplus
      extern "C" {
      #endif
      
      	// 本地方法,注意命名规范:首字母大写_项目包名_所在Activity名_Java中声明的方法名
      	// env是JVM的指针,thiz是调用该方法的Java对象
      	jstring Java_cc_catface_helloworld_OneActivity_getStr(JNIEnv *env, jobject thiz) {
      		
      		// 返回字符串
      		return env->NewStringUTF("来自C++的问候");
      	
      	}
      
      #ifdef __cplusplus
      }
      #endif
      
    3. Android.mk

      LOCAL_PATH       := $(call my-dir)
      
      include $(CLEAR_VARS)
      
      LOCAL_MODULE     := jni-test
      LOCAL_SRC_FILES  := test.cpp
      
      include $(BUILD_SHARED_LIBRARY)
      

      其中 LOCAL_MODULE 表示模块名称,LOCAL_SRC_FILES 表示需要编译的源文件

    4. Application.mk

      APP_ABI := armeabi
      

      API_ABI 表示CPU的架构平台类型,主要平台类型有 armeabi、x86、mips。NDK默认会编译产生全平台 .so库,即 APP_ABI := all,但是我们可以指定仅产生某一平台的 .so库,因为大部分真机都是 armeabi 平台的嘛,注意使用模拟器时可能是 x86架构

    最后本案例的运行结果如下

    这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值