android NDK——转换C++;方法转换为java方法
我正在开发一个android应用程序,它可以从任何拍摄到的图像中提取大量的文字 为此,我将使用opencv库 现在我有一个C++方法:android NDK——转换C++;方法转换为java方法,java,android,c++,opencv,android-ndk,Java,Android,C++,Opencv,Android Ndk,我正在开发一个android应用程序,它可以从任何拍摄到的图像中提取大量的文字 为此,我将使用opencv库 现在我有一个C++方法: void-extractingtraining词汇表(const-path和basepath){…} 我在android活动中需要它 void extractTrainingVocabulary(const path& basepath) { for (directory_iterator iter = directory_iterator(bas
void-extractingtraining词汇表(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;
}
}
}
}
}
void提取培训词汇表(常量路径和基本路径){
对于(目录迭代器iter=目录迭代器(basepath);iter
!=目录_迭代器();iter++){
目录\条目=*iter;
if(是_目录(entry.path())){
cout第一个问题是,在C/C++代码中,path
的基本类型是什么,例如,如果这是字符串,那么您需要使用字符串值作为输入来声明Java方法
class Dude{
public native void extractTrainingVocabulary(final String arg);
}
首先用javac dude.java
编译dude类
然后您需要头文件,将生成的类文件传递给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
/*不要编辑此文件-它是机器生成的*/
#包括
/*班长头球*/
#如果包括你,伙计
#定义,包括,伙计
#ifdef_uucplusplus
外部“C”{
#恩迪夫
/*
*班级:哥们
*方法:提取训练词汇
*签名:(Ljava/lang/String;)V
*/
JNIEXPORT void JNICALL Java\u Dude\u提取培训词汇表
(JNIEnv*,jobject,jstring);
#ifdef_uucplusplus
}
#恩迪夫
#恩迪夫
在上面的代码中,jstring
指向该方法的Java输入参数,您可能需要使用该参数。
下一步是,实现<代码> JavaAdUDeDePultTrimeStudio/[Cord>'函数并调用实际方法。< /P>希望这将有助于我对C++是新的,但是在Google之后,这个代码<代码> const PATH和BasePATAs/COD>是一个const引用,所以我不知道如何转换它,java不使用。references@nawaraJava只对ev使用引用任何东西(除了基本类型)。但这不是重点,对于JNI,您只能传递,因此您需要以JNI函数中的jstring为例,构造一个path
对象(不管是什么)在JNI函数的C实现中,然后使用该对象从JNI函数内调用现有的C函数。现在它不是一个字符串,路径是C++类,我编辑了我的问题,添加了代码> ExtCTCtrasing词汇表< /Cord>实现。没有问题,伙计,这里的路径类型是什么,不管是什么类/结构/等等。问题是它需要创建什么?!如果它需要两个int,一个字符串和一个字节[]数据,所以您将更改java方法声明,但记住只传递真正需要从java应用程序传递的数据,没有默认值,常数等。如果我理解您的响应,我应该把我的java方法传递给C++方法所需要的,以及<代码>路径<代码>(无论它的类型)需要?这两个方法没有必要具有相同的参数?当然,伙计,您需要知道创建Path
类型的要求,如果它需要2个整数,那么java应用程序将整数传递给c/c++代码,然后在本机代码中使用这两个整数创建实际类型。