NDK开发笔记 ✎

作者: 灵魂奏响曲 | 来源:发表于2016-08-18 22:36 被阅读221次

一、简单了解

NDK全名:Native Development Kit
由Google提供,帮助开发C/C++动态共享库,在Android上运行

二、下载配置

  1. 下载地址:
    https://developer.android.com/ndk/downloads/index.html

  2. 环境配置(Linux环境)

  • 下载的linux下的压缩包解压后的目录:/home/jiana/Android/android-ndk-r12b
  • vim打开环境配置文件$sudo vim /etc/profile
    当前配置:
ANT_HOME=/home/jiana/app/apache-ant-1.9.7
JAVA_HOME=/usr/java/jdk1.8.0_91
PATH=$JAVA_HOME/bin:$PATH:$ANT_HOME/bin
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:/home/jiana/文档/javaStudy:/home/jiana/workspace
export JAVA_HOME PATH CLASSPATH ANT_HOME

添加NDK配置后:

NDK_HOME=/home/jiana/Android/android-ndk-r12b
ANT_HOME=/home/jiana/app/apache-ant-1.9.7
JAVA_HOME=/usr/java/jdk1.8.0_91
PATH=$JAVA_HOME/bin:$PATH:$ANT_HOME/bin:$NDK_HOME
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:/home/jiana/文档/javaStudy:/home/jiana/workspace
export JAVA_HOME PATH CLASSPATH ANT_HOME NDK_HOME
  • 重启电脑
  • 测试是否配置成功$ ndk-build

三、编写JNI程序

简介:JNI全名Java Native Interface,java代码调用其他语言代码的接口。

  • 简单案例实现,步骤:(Android studio项目中)
    • 功能:返回传入的参数
    • activity_main.xml添加一个按钮
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="match_parent"
   android:layout_height="match_parent">
   <Button
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:text="New Button"
       android:onClick="btnClick" />
</RelativeLayout>
  • MainActivity中添加Button点击事件,和native声明的方法
    public void btnClick(View view) {
        Button btn = (Button) view;
        btn.setText(say("hello world"));
    }
    public native String say(String value);
  • 生成.h头文件:1.到项目的java目录。2.命令:javah -jni 包名+类名
    选区_021.png
  • 创建放C/C++代码的目录:项目/app目录右击 > New > Folder > JNI Folder > Finish
    出现jni目录:项目名/app/src/main/jni
    将头文件io_xujiaji_nativetest_MainActivity.h放进jni目录
  • jni目录下创建一个C文件say.c
#include "io_xujiaji_nativetest_MainActivity.h"
JNIEXPORT jstring JNICALL Java_io_xujiaji_nativetest_MainActivity_say
(JNIEnv * env, jobject obj, jstring say){
  return say;
}
  • 生成动态链接库
    • 在jni目录添加动态链接库配置文件Android.mk

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := say
LOCAL_SRC_FILES := say.c
include $(BUILD_SHARED_LIBRARY)
```
意义:
LOCAL_PATH:编译的路径
include $(CLEAR_VARS):清除一些LOCAL_XXX样式的模块
LOCAL_MODULE:定义模块的名称
include $(BUILD_SHARED_LIBRARY):编译的是动态链接库
- 编译
命令进入jni目录下编译:ndk-build

选区_023.png

Android studio项目配置

  • local.properties添加ndk目录:
    ndk.dir=/home/jiana/Android/android-ndk-r12b
  • 在gradle.properties添加:android.useDeprecatedNdk=true
  • 在app/build.gradle的defaultConfig{}中添加:
      ndk{
          moduleName "say"//mk中定义的模块名
      }
  • 在MainActivity中加载动态链接库
  static {
      System.loadLibrary("say");
  }

运行

点击按钮前.png

↓↓↓
↓↓↓


点击按钮后.png

相关文章

网友评论

    本文标题:NDK开发笔记 ✎

    本文链接:https://www.haomeiwen.com/subject/wqovsttx.html