4. RKNN API

Rockchip提供了一套RKNN API SDK,该SDK为基于 RK3399Pro Linux/Android 的神经网络NPU硬件的一套加速方案,可为采用RKNN API 开发的AI相关应用提供通用加速支持。

RKNN API SDK相关API介绍请参考文档《RK3399Pro_Linux&Android_RKNN_API_V*.pdf》,以下为RKNN API配置使用介绍,详细内容请参考RKNN API中的示例。

4.1. 1. Linux系统

应用程序只需要包含该头文件和动态库,就可以编写相关的AI应用。

4.1.1. Fedora

4.1.1.1. 1)通过dnf安装rknn-api开发包

sudo dnf install –y rknn-api

使用方式如下:

a. 引用头文件:

#include <rockchip/rknn_api.h>

b. 在Makefile中添加如下语句链接库文件:

LDFLAGS += -lrknn_api

4.1.1.2. 2)通过网盘下载

百度网盘下载RKNN API:下载链接 (提取码:17t4)

使用方式如下:

a. 将rknn_api目录拷贝到项目根目录

b. 引用头文件:

#include "rknn_api.h"

c. 在Makefile中添加如下语句设置链接库路径和头文件路径

CFLAGS += -Lrknn_api/lib64 -Irknn_api/include

d. 在Makefile中添加如下语句链接库文件:

LDFLAGS += -lrknn_api

最终参考目录结构如下:

...
├── Makefile
└── rknn_api
    ├── include
    │   └── rknn_api.h
    └── lib64
        └── librknn_api.so
 ...

4.1.2. Ubuntu

请参考2)通过网盘下载进行配置使用。

4.2. 2. Android系统

RKNN API支持Android 8.1/Android9.0且由Firefly发布的系统(或从发布的源码中编译的系统)。

通过百度网盘下载RKNN API:下载链接 (提取码:17t4)

RKNN API的动态库路径为lib64/librknn_api.so和lib/librknn_api.so。应用程序只需要包含该头文件和动态库,就可以编写相关的AI应用的JNI库。目前Android上只支持采用JNI的开发方式。

Android Studio具体配置方式如下:

a. 将lib64/librknn_api.so复制到项目jniLibs/arm64-v8a目录下,将lib/librknn_api.so复制到jniLibs/armeabi-v7a目录下。结果目录结果如下:

├── jniLibs
│   └── arm64-v8a
│       └── librknn_api.so
│   └── armeabi-v7a
│       └── librknn_api.so

b. 将rknn_api.h复制到jni源码目录下,如下参考:

├── jni
│   ├── direct_texture.cc
│   ├── direct_texture.h
│   ├── rknn_api.h
│   ├── ssd_image.cc
│   ├── ssd_image.h
│   ├── ssd_native_c_api.cc
│   └── ssd_native_c_api.h

c. 配置CMakeLists.txt,链接librknn_api.so

...
set(link_libs ${CMAKE_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/librknn_api.so
               ...
              ${log-lib}
)
target_link_libraries( rkssd4j
                       ${link_libs} )
...

d. 配置build.gradle只编译arm64-v8a和armeabi-v7a的jni库

android {
    compileSdkVersion 28
    buildToolsVersion '28.0.3'
    defaultConfig {
        ...
        ndk {
            abiFilters "arm64-v8a", "armeabi-v7a"
        }
    }
    ...
    externalNativeBuild {
        cmake {
            path "CMakeLists.txt"
        }
    }
}

最终目录结构大致如下:

# pwd: $(project_root)/app
.
├── app.iml
├── build
...
├── build.gradle
├── CMakeLists.txt
└── src
    └── main
        ├── AndroidManifest.xml
        ...
        ├── jni
        │   ├── direct_texture.cc
        │   ├── direct_texture.h
        │   ├── rknn_api.h
        │   ├── ssd_image.cc
        │   ├── ssd_image.h
        │   ├── ssd_native_c_api.cc
        │   └── ssd_native_c_api.h
        ├── jniLibs
        │   └── arm64-v8a
        │       └── librknn_api.so
        │   └── armeabi-v7a
        │       └── librknn_api.so
        ...