android NDK——转换C++;方法转换为java方法

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

我正在开发一个android应用程序,它可以从任何拍摄到的图像中提取大量的文字 为此,我将使用opencv库

现在我有一个C++方法:
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++代码,然后在本机代码中使用这两个整数创建实际类型。