0
点赞
收藏
分享

微信扫一扫

使用AS的NDK工具开发JNI


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

  1. Ctrl Alt Shift S 快捷键打开如下窗口,点击Download Android NDK.
  2. 如下图,NDK会自动下载安装好
  3. NDK下载好后配置下系统环境变量,方便编译.so库

如下可执行 ​ndk-build

使用AS的NDK工具开发JNI_so库

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

使用AS的NDK工具开发JNI_本地方法_02

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

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

使用AS的NDK工具开发JNI_Android_03

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

android {

......

buildTypes {
release {

......

}

sourceSets {
main {
jni.srcDirs = []
}
}
}
}

  1. 看看代码
  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();
}

  1. 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

  1. 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 表示需要编译的源文件

  1. Application.mk

APP_ABI := armeabi

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

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

使用AS的NDK工具开发JNI_Android_04


举报

相关推荐

0 条评论