Android NDK 开发之菜鸟

由于本人最近在帮一个朋友看NDK开发,期间遇到过一些不懂的问题,而在网上又没有找到什么好的解决方案;因此记录下来供参考。

首先呢,我使用的工具是Android Studio 一般来说配置好NDK也就可以了,这种教程网上也是有很多的。在这就不说了。

而我今天说的是另一种方案,不在Android Studio里面或者Eclipse里写JNI;而是使用Visual Studio 或者我使用的是QT Creator 中写项目,使用NDK进行编译。这种方式应该也是有很多人使用的。

 

当然在此之前你需要下载好NDK我使用的是NDK-r11,其它版本应该也是一样的。

 

 

  1. 创建一个项目

    Android NDK 开发之菜鸟

     

    一直next;

    Android NDK 开发之菜鸟

     

  2. 创建一个测试JNI的类

    Android NDK 开发之菜鸟

     

  3. 编译项目,并进入到项目的class目录中,生成.h文件
    Android NDK 开发之菜鸟
    Android NDK 开发之菜鸟


    注意目录关系,Eclipse中就是打开bin目录


    Android NDK 开发之菜鸟

    Android NDK 开发之菜鸟


    当然你也可以使用cd来进入到这个目录

    然后使用命令行来生成.h文件


    Android NDK 开发之菜鸟




    使用javah 后面跟包名.类名

    如果javah错,是你的JDK环境没配置好。如果找不到这个类,可能你还没有编译

    然后关闭命令行,在目录中可以发现多了一个文件

    Android NDK 开发之菜鸟
  4. 使用QT Creator 或者Visual Studio 建立一个项目,实现上面.h中的方法
    Android NDK 开发之菜鸟

    Android NDK 开发之菜鸟

    使用C++开发工具

    使用c或者c++就是个人习惯了,不过在语法上略有差别

    这里就不多说了,直接看结果。

    注:有的编译器可能要将系统生成的#include <jni.h> 改为 #include "jni.h"

    Android NDK 开发之菜鸟


    红色框中代码可能会有问题,可以直接使用注释的部分
    Android NDK 开发之菜鸟

     
  5. 编写.mk文件,使用NDK打包成.so

    切换到hellojni的目录

    Android NDK 开发之菜鸟

    新建这两个文件android.mk 和Application.mk 文件
    android.mk中的内容为:

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

    Android NDK 开发之菜鸟
    Application.mk 中的内容为:

    APP_ABI    := all
    APP_STL := stlport_static

    说明:
    APP_ABI
    默认情况下,NDK的编译系统会生成"armeabi"ABI生成机器代码。all 是所有平台的机器

    APP_STL
    默认情况下,NDK的编译系统为最小的C++运行时库,这里使用了string 就需要设置这个了

    最后,删除导入的jni.h 和jni_md.h (放进来是为了编写方便,编译时不需要)

    Android NDK 开发之菜鸟

    同样,在这个地方输入cmd

    Android NDK 开发之菜鸟

    这样就是成功了,去上级目录看下生成的文件,出错的话可能是JNI编写的语法有错误,可以根据情况找出问题

    Android NDK 开发之菜鸟

    看下libs里面的文件

    Android NDK 开发之菜鸟

    Android NDK 开发之菜鸟

    Android NDK 开发之菜鸟

    将这里面的文件放到项目中去,我只考了一个,根据实际情况

    Android NDK 开发之菜鸟

    在build.gradle中配置

    Android NDK 开发之菜鸟

     

    sourceSets {
    main {
    jniLibs.srcDirs = ['libs']
    }
    }

     

    在JniTest中加载lib

    Android NDK 开发之菜鸟

     

    在Activity 中测试效果

     

    Android NDK 开发之菜鸟

     

    Android NDK 开发之菜鸟

    运行看下结果

    Android NDK 开发之菜鸟

     

     

    好了,到这里就结束了。

转载于:https://my.oschina.net/afox/blog/742278