|
【Android】
ROC-RK3566安卓RKNN模型例程无法使用,且会导致重启
发表于 2021-8-20 15:40:07
浏览:16518
|
回复:14
打印
只看该作者
[复制链接]
楼主
本帖最后由 zwmasdf 于 2021-8-20 15:45 编辑
如题,安卓RKNN模型无法按照例程跑,主要有以下几个问题
一、rknnrt/examples/rknn_mobilenet_demo下的例程无法编译,按照ReadMe.md的步骤无法完成CMake的编译
主要修改了:ANDROID_NDK_PATH=......../Android/Sdk,这里不管指向Sdk还是指向Sdk/ndk、21.4.7075529都无法导致编译成功,
然后尝试修改了19行的cmake为C:/Users/R190095/AppData/Local/Android/Sdk/cmake/3.10.2.4988404/bin/cmake还是无法编译成功,
提示无法找到....../Android/Sdk/platforms/android-24,然后去Sdk/platforms下找,发现没有android-24的文件夹,至此,放弃该编译方式。
使用第二种NDK+Cmake编译
二、使用Android Studio新建Native C++工程
修改app/build.gradle,修改如下:
- defaultConfig {
- ......
- externalNativeBuild {
- cmake {
- cppFlags ''
- abiFilters 'armeabi-v7a', "arm64-v8a"
- }
- }
- ndk {
- abiFilters 'armeabi-v7a', "arm64-v8a"
- }
- }
复制代码 然后将rknn相关lib和头文件加到工程中,如图所示
然后修改CMakeList.txt,代码如下:
- cmake_minimum_required(VERSION 3.10.2)
- project("mytest")
- add_library(
- mytest
- SHARED
- native-lib.cpp)
- include_directories(${CMAKE_SOURCE_DIR}/include)
- add_library(rknn_api_android #这里不管有没有android后缀都一样
- SHARED
- IMPORTED)
- set_target_properties(rknn_api_android #这里不管有没有android后缀都一样
- PROPERTIES IMPORTED_LOCATION
- ${CMAKE_SOURCE_DIR}/lib/${ANDROID_ABI}/librknn_api_android.so) #这里不管有没有android后缀都一样
- add_library(rknnrt
- SHARED
- IMPORTED)
- set_target_properties(rknnrt
- PROPERTIES IMPORTED_LOCATION
- ${CMAKE_SOURCE_DIR}/lib/${ANDROID_ABI}/librknnrt.so)
- find_library(
- log-lib
- log)
- target_link_libraries(
- mytest
- rknn_api_android #这里不管有没有android后缀都一样
- rknnrt
- ${log-lib})
复制代码 接着修改native-lib.cpp代码,内容如下:
- #include <jni.h>
- #include <string>
- #include <android/log.h>
- #include <pthread.h>
- #include "rknn_api.h"
- #define TAG "NATIVE_LIB"
- #define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, TAG, __VA_ARGS__)
- static unsigned char *load_model(const char *filename, int *model_size)
- {
- FILE *fp = fopen(filename, "rb");
- if(fp == nullptr) {
- LOGD("fopen %s fail!\n", filename);
- return nullptr;
- }
- fseek(fp, 0, SEEK_END);
- int model_len = ftell(fp);
- unsigned char *model = (unsigned char*)malloc(model_len);
- fseek(fp, 0, SEEK_SET);
- if(model_len != fread(model, 1, model_len, fp)) {
- LOGD("fread %s fail!\n", filename);
- free(model);
- return nullptr;
- }
- *model_size = model_len;
- fclose(fp);
- return model;
- }
- void* test(void *arg) {
- int model_len = 0;
- unsigned char *model = nullptr;
- rknn_context ctx;
- int ret;
- model = load_model("/vendor/model/mobilenet_v1.rknn", &model_len);
- if(!model) {
- LOGD("load model failed\n");
- return nullptr;
- }
- LOGD("load model ok");
- ret = rknn_init(&ctx, model, model_len, 0, nullptr);
- if(ret < 0) {
- LOGD("rknn_init fail! ret=%d\n", ret);
- return nullptr;
- }
- LOGD("rknn_init ok");
- return nullptr;
- }
- extern "C" JNIEXPORT jstring JNICALL
- Java_com_example_mytest_MainActivity_stringFromJNI(
- JNIEnv* env,
- jobject /* this */) {
- std::string hello = "Hello from C++";
- LOGD("hello");
- int err;
- pthread_t ntid;
- err = pthread_create(&ntid, nullptr, test, nullptr);
- if (err != 0) {
- LOGD("can't create thread: %s\n", strerror(err));
- }
- return env->NewStringUTF(hello.c_str());
- }
复制代码
然后使用adb root && adb remount激活root(前提是安卓启用开发者并启用root)
接着把rknn_mobilenet_demo下的model文件夹通过adb push model /vendor/拷贝到开发板内
接着adb push Android/rknn_server/${BOARD_ARCH}/rknn_server到/vendor/bin目录,这里试了切换不同架构的rknn_server也不行
然后adb push Android/librknn_api/${BOARD_ARCH}/librknnrt.so到/vendor/lib64(64位系统特有)和/vendor/lib目录,换架构也不行
然后adb shell进入控制台, 并通过su切换成root, 接下来执行:
chmod 777 /vendor/bin/rknn_server
setenforce 0
/vendor/bin/rknn_server &
然后编译安卓程序,运行后控制台依次打印hello和load model ok,然后卡住了,app上也没显示Hello from C++
然后过了几秒钟开发板重启了,尝试切换架构,push不同的文件到开发板,都不行
后来去/vendor/lib和/vendor/lib64下看librknnrt.so文件属性,发现都是只读的,而且无法删除
以上是尝试调用rknn的过程,但是一直以失败而告终,请求支持
|
|