2013-10-21 16 views
0

我開發一個Android應用程序中提取文字的袋子從任何拍攝的圖像 我將使用OpenCV庫爲目的folliwing這tutorial的Android NDK --converting C++方法的Java mthod

現在我有一個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

我希望這將有助於 http://stackoverflow.com/questions/502430/passing-const-variable-to-method-in-java/502457#502457 – Rajj

+0

我是新的C++,但經過谷歌搜索這個參數'const path&basepath'是一個const引用,所以我不知道如何轉換它,java不使用引用 – nawara

+0

@nawara Java只對所有東西(除了原始類型)使用引用。但是,這並不重要,用JNI你只能傳遞[JNI Types](http://docs.oracle.com/javase/1.5.0/docs/guide/jni/spec/types.html),所以你需要以JNI函數中的jstring爲例,在該JNI函數的c實現中構造一個'path'對象(不管是什麼)。然後使用該對象從JNI函數中調用現有的c函數。 – PeterT

回答

2

第一個問題是,什麼是path在C/C++代碼的基本類型,例如,如果這是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函數並調用實際方法。

+0

現在它不是一個字符串,路徑是一個C++類 我編輯我的問題添加'extarctTrainingVocabulary'實現 – nawara

+0

沒問題的傢伙,無所謂路徑的類型是什麼類/結構/等等。 ,所以問題是它需要創建什麼?!如果它需要兩個int,一個String和一個byte []數據,那麼你應該改變java方法聲明來實現,但記住只傳遞真正需要從java應用程序傳遞的數據,沒有默認值,常量等等...... – 2013-10-21 11:21:01

+0

如果我理解你的回答,我應該傳遞給我的java方法,C++方法需要什麼以及「Path」(無論它的類型)需要什麼? 2種方法沒有必要具有相同的參數? – nawara