我正在开发一个Android应用程序,可以从任何捕获的图像中提取单词包 我将使用opencv库来实现此tutorial
现在我有一个C ++方法:
void extractTrainingVocabulary(const path& basepath) {...}
我在Android活动中需要它
void extractTrainingVocabulary(const path& basepath) {
for (directory_iterator iter = directory_iterator(basepath); iter
!= directory_iterator(); iter++) {
directory_entry entry = *iter;
if (is_directory(entry.path())) {
cout << "Processing directory " << entry.path().string() << endl;
extractTrainingVocabulary(entry.path());
} else {
path entryPath = entry.path();
if (entryPath.extension() == ".jpg") {
cout << "Processing file " << entryPath.string() << endl;
Mat img = imread(entryPath.string());
if (!img.empty()) {
vector<KeyPoint> keypoints;
detector->detect(img, keypoints);
if (keypoints.empty()) {
cerr << "Warning: Could not find key points in image: "
<< entryPath.string() << endl;
} else {
Mat features;
extractor->compute(img, keypoints, features);
bowTrainer.add(features);
}
} else {
cerr << "Warning: Could not read image: "
<< entryPath.string() << endl;
}
}
}
}
}
所以按照android NDK
教程
我应该像这样声明这个方法:public native void extractTrainingVocabulary () ;
我的问题是如何处理C ++参数const path& basepath
?如何在java方法中传递这个参数
我希望我的问题对你很清楚 谢谢
答案 0 :(得分:2)
第一个问题是,C / C ++代码中path
的基本类型是什么,例如,如果这是String,那么您需要使用String值声明Java方法作为输入。
class Dude{
public native void extractTrainingVocabulary(final String arg);
}
首先使用javac Dude.java
编译花花公子类
然后你需要头文件,将生成的类文件传递给javah Dude
,然后javah
会给你一个头文件,就像这样。
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class Dude */
#ifndef _Included_Dude
#define _Included_Dude
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: Dude
* Method: extractTrainingVocabulary
* Signature: (Ljava/lang/String;)V
*/
JNIEXPORT void JNICALL Java_Dude_extractTrainingVocabulary
(JNIEnv *, jobject, jstring);
#ifdef __cplusplus
}
#endif
#endif
在上面的代码中,jstring
指向方法的Java输入参数,可能需要使用那个人。
下一步是,实现Java_Dude_extractTrainingVocabulary
函数并调用实际方法。