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