imread 在普通的 c++ 程序中工作,但在 android 和 ndk native 中不工作
imread works in a normal c++ program, but not in android with ndk native
#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" );
}
}
这就是我在 android 项目的 Native Cpp 部分中的内容。
当我 运行 使用模拟器的应用程序时,它总是显示:"No data in image!"
text.
我把这个程序单独编译成了一个普通的c++ opencv程序。它工作得很好。
我也给出了绝对路径。这还不够吗?
我也必须在 build.gradle
中写点什么吗?
如果重要的话,我正在使用 Android studio。
Android 目录根本不匹配 Linux。
一个好的解决方案是通过Java找到你的文件,并将文件的路径作为参数传递给函数Java_com_example_cppinandroid_MainActivity_stringFromJNI。
如果您的文件在 public 个文件中,您可以尝试“/sdcard/a.png” - 但不同的 android shell 之间的路径可能会有所不同。
从 public 个文件中读取的可能解决方案:
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 read text file from asset folder using C (ndk) or How to properly pass an asset FileDescriptor to FFmpeg using JNI in Android。
#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" );
}
}
这就是我在 android 项目的 Native Cpp 部分中的内容。
当我 运行 使用模拟器的应用程序时,它总是显示:"No data in image!"
text.
我把这个程序单独编译成了一个普通的c++ opencv程序。它工作得很好。
我也给出了绝对路径。这还不够吗?
我也必须在 build.gradle
中写点什么吗?
如果重要的话,我正在使用 Android studio。
Android 目录根本不匹配 Linux。
一个好的解决方案是通过Java找到你的文件,并将文件的路径作为参数传递给函数Java_com_example_cppinandroid_MainActivity_stringFromJNI。
如果您的文件在 public 个文件中,您可以尝试“/sdcard/a.png” - 但不同的 android shell 之间的路径可能会有所不同。
从 public 个文件中读取的可能解决方案:
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 read text file from asset folder using C (ndk) or How to properly pass an asset FileDescriptor to FFmpeg using JNI in Android。