imread работает в обычной программе на C ++, но не в android с ndk native - PullRequest
0 голосов
/ 09 мая 2020
#include <jni.h>
#include <string>

#include <opencv2/opencv.hpp>
using namespace cv;

#include <iostream>

extern "C" JNIEXPORT jstring JNICALL
Java_com_example_cppinandroid_MainActivity_stringFromJNI( JNIEnv* env,
                            jobject)
{
    Mat image;
    image = imread( "/home/<name>/a.png", 1 );

    if ( !image.data )
    {
        return env->NewStringUTF( "No data in image!" );
    } else
    {
        return env->NewStringUTF( "Data is in image" );
    }
}

Это то, что у меня есть в Native Cpp части проекта android.
Когда я запускаю приложение с эмулятором, оно всегда показывает: "No data in image!" текст.

I скомпилировали эту программу отдельно как обычную программу opencv на C ++. Он работает отлично.
Я тоже указал абсолютный путь. Этого мало?

Нужно ли мне также писать что-то в build.gradle?

Я использую Android studio, если это важно.

1 Ответ

1 голос
/ 09 мая 2020

Android каталоги вообще не соответствуют Linux.

Хорошее решение - найти ваш файл через Java и передать путь к файлу в качестве параметра функции Java_com_example_cppinandroid_MainActivity_stringFromJNI.

Если ваш файл находится в файлах publi c, вы можете попробовать "/sdcard/a.png", но путь может различаться в разных оболочках android.

Возможное решение от чтения из publi c файлов:

Java:

File f = new File(Environment.getExternalStorageDirectory().getAbsolutePath()+ File.separator + fileName);
if (f.exists()) {
foo(f.getAbsolutePath());

NDK:

extern "C" JNIEXPORT jstring JNICALL
Java_com_example_cppinandroid_MainActivity_stringFromJNI(JNIEnv* env,
                            jobject, jstring javaPath)
{
    const char* path = env->GetStringUTFChars(javaPath, 0);
    Mat image;
    image = imread( path, 1 );
    env->ReleaseStringUTFChars(javaPath, path );
    if ( !image.data )
    {
        return env->NewStringUTF( "No data in image!" );
    } else
    {
        return env->NewStringUTF( "Data is in image" );
    }
}

Лучший способ хранить изображение в активах и читать AAssetManager как Android читать текстовый файл из папки ресурсов, используя C (ndk) или Как правильно передать FileDescriptor ресурса в FFmpeg с помощью JNI в Android.

...