介绍如何的就免了.直接进入正题

介绍怎么着的就免了.直接进入正题

首先最有代表性的参阅链接:

原来的作品地址:

平台: Windows 10

平台: Windows 10

下边是私有配置SDK开发经历

 

IDE : Visual studio 2017

IDE : Visual studio 2017

  1. 下载LibreOffice与SDK

有一种办法不需求协调计划全数的Sun JDK, Android
SDK以及NDK,Eclipse等设置,使用已经安排好的支出套件就能够进行直接的付出,由NVIDIA开发的开发套件Tegra
Android Development
Pack可见直接设置好全数的开支条件,而且流行的本子还包涵了OPENCV,不想协调布署的爱侣能够一贯下载这几个套件。可是小编自己没有品味过使用那些套件,怎么利用也不通晓,所以一旦不想自身布署环境的话依然必要协调去看看这么些套件的应用。

率先从官网下载最新的SDK,

首先从官网下载最新的SDK,

    链接:

 

成立流程. 

开创流程. 

 

 

小结一下第二点. (注意:官网教程里的SDK目录和种类目录是同级目录,所以选取了相对路径,实际项目中要依照景况更改)

小结一下至关心注重要点. (注意:官网教程里的SDK目录和类型目录是同级目录,所以接纳了相对路径,实际项目中要遵照情状更改)

  1. 安装LibreOffice与SDK

 

  1. 将 sciter-sdk\include 出席富含目录
  1. 将 sciter-sdk\include 加入富含目录

   
安装进程比较简单,若要更改安装目录时则改成内定的设置目录即可,别的都以暗许安装。

1. Sun JDK

 

 

先是供给设置java开发条件,那里不可不运用Sun JDK,不能选择Opencv JDK.
安卓开发不援助Opencv JDK.

JDK下载地址:

建议下载稳定版本的J2SE.

安装好 Sun JDK后要求遵从java JDK的设置格局安顿环境变量。

安装JDK系统环境变量:

在环境变量中添加如下内容

JAVA_HOME= C:\Program Files\Java\jdk1.X.XXX
Path=…..; %JAVA_HOME%\bin

 

澳门金沙国际 1

 

 

2.
变更输出目录(可选)

2.
改动输出目录(可选)

   
先安装LibreOffice,再设置SDK(注:SDK安装的路径选拔跟LibreOffice安装路径一样)

2. Android SDK

 

 

设置安卓开发用的SDK,能够从    那里下载最新的SDK。下载完结后解压缩到叁个不带有空格的目录即可。建议使清晰明了的目录,今后还要用。

建议将SDK安装到独门的文件夹中,文件夹名不要有空格,也休想起普通话名字。

Android SDK
不用配置种类环境变量,在Eclipse中开创Android的工程时候照旧安装完ADT(Android
Development Tools)之后会唤起配置Android  SDK
目录。那里只要保证目录名字不含有空格就足以了。

 

 

  1. 更改DPI
    识别选项
  1. 更改DPI
    识别选项

    LibreOffice安装路径:D:\LibreOffice

3. Eclipse

 

 

下载Eclipse作为支出用的IDE

下载地址:

提醒:最新发现下载的ADT中包涵了前卫版本Eclipse,能够不用下载。

 

 

4.
将 sciter-sdk/include/sciter-win-main.cpp
文件添加到项目

4.
将 sciter-sdk/include/sciter-win-main.cpp
文件添加到项目

    SDK安装路径:D:\LibreOffice\sdk

4. Android Development Tools(ADT)

 

 

下载安卓开发工具包,蕴含部分常用的开发工具。

也能够向来运用Eclipse在线安装,但下载后再装相比较便宜,速度快。

下载地址: 

 

下载完ADT后,给Eclipse安装ADT组件。

在Eclipse中:菜单Help–>Install new Software

 

澳门金沙国际 2

 

安装ADT时的截图如下:

 

澳门金沙国际 3

 

 

以此时候晤面到两类组件,一类是Develop Tools,还有正是NDT Plugins,NDT
Plugins是当地编制程序编译工具,也正是用来编写翻译本地C++代码的,提议将两组织工作具都全体安装。

专门表达:如若你要求做地方C++开发以来,一定要把NDT
Plugins勾选上。(注释:安装的时候必须选用NDK Plugins)

 

澳门金沙国际 4

 

 

5.替换IDE自动生成的 helloWorld.cpp 为

5.替换IDE自动生成的 helloWorld.cpp 为

3.
设置完SDK后,可根据SDK目录下的doc\install.html里面的链接下载并安装需求的工具。

5. 配置Eclipse

 

 

ADT安装收尾,应该能够在Eclipse工具栏和Window菜单上找到Android
SDK管理器的图标

 

澳门金沙国际 5

 

点击Preferences起始设置Eclipse的Android开发环境……

 

澳门金沙国际 6

 

设置安卓开发的SDK目录,那里要求将SDK目录内定到刚刚大家下载的Android
SDK目录的根目录。

 

澳门金沙国际 7

 

 

在Eclipse中甄选Windows->Android SDK
Manager,可以管理下载的SDK,也得以下载最新的SDK,用于差别的SDK平台支付。

采取你所急需耗费的阳台的SDK(笔者最早下载的要命SDK包涵了好多本子的SDK,不过最新下载的新型的SDK,结果只包含了很好的Android
4.3的API,很多都亟需本身下载)

 

澳门金沙国际 8

 

 

// HelloWorld.cpp : Defines the entry point for the application.
//

#include "stdafx.h"
#include "HelloWorld.h"

#include "sciter-x-window.hpp"

class frame : public sciter::window {
public:
  frame() : window(SW_TITLEBAR | SW_RESIZEABLE | SW_CONTROLS | SW_MAIN | SW_ENABLE_DEBUG) {}
};

#include "resources.cpp"

int uimain(std::function<int()> run) {

  //sciter::debug_output_console console; - uncomment it if you will need console window

  sciter::archive::instance().open(aux::elements_of(resources)); // bind resources[] (defined in "resources.cpp") with the archive

  frame *pwin = new frame();

  // note: this:://app URL is dedicated to the sciter::archive content associated with the application
  pwin->load(WSTR("this://app/main.htm"));

  pwin->expand();

  return run();

}
// HelloWorld.cpp : Defines the entry point for the application.
//

#include "stdafx.h"
#include "HelloWorld.h"

#include "sciter-x-window.hpp"

class frame : public sciter::window {
public:
  frame() : window(SW_TITLEBAR | SW_RESIZEABLE | SW_CONTROLS | SW_MAIN | SW_ENABLE_DEBUG) {}
};

#include "resources.cpp"

int uimain(std::function<int()> run) {

  //sciter::debug_output_console console; - uncomment it if you will need console window

  sciter::archive::instance().open(aux::elements_of(resources)); // bind resources[] (defined in "resources.cpp") with the archive

  frame *pwin = new frame();

  // note: this:://app URL is dedicated to the sciter::archive content associated with the application
  pwin->load(WSTR("this://app/main.htm"));

  pwin->expand();

  return run();

}

    工具:

6. 创办虚拟机

 

 

接纳Android Virtual Device Manager管理和开创虚拟机,用于调节和测试。

(配置虚拟机的时候,有的虚拟机配置能够选取是不是模拟GPU,建议依据本人的布局须要开始展览测试,小编有3回使用了仿照GPU,结果模拟器的图像显示完全有毛病)

 

澳门金沙国际 9

 

澳门金沙国际 10

 

澳门金沙国际 11

 

————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————

 

 

    1)LibreOffice与SDK

地点部分重视介绍了Android开发环境的主干配置步骤,上面将要通过演示,讲解怎么样布置NDK实行本地JNI调用。

 

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

 

 

 

6.在档次根目录下添加 res/main.htm

6.在项目根目录下添加 res/main.htm

    2)JDK(1.5 or higher)

7.  安装CDT(CDT plugin for Eclipse)

 

 

 

Eclipse的CDT插件是用来在Eclipse举办C++开发的工具,若是您在配置安卓开发环境的时候安装ADT的历程中,已经接纳了NDK
Plugins,那么就不要求再展开安装了,因为NDK
Plugins已经包罗了CDT,如下图:

 

万一在设置的时候从不采用NDK插件,那么须要再度安装CDT。

 

澳门金沙国际 12

 

 

 

<html>
    <head>
        <title>Test</title>
        <style></style>
        <script type="text/tiscript"></script>
    </head>
    <body>

      Hello World!

    </body>
</html>
<html>
    <head>
        <title>Test</title>
        <style></style>
        <script type="text/tiscript"></script>
    </head>
    <body>

      Hello World!

    </body>
</html>

【澳门金沙国际】Windows创制Sciter的首先个程序,代码开发配置格局。    3)C++ complier (Windows:Microsoft C++ Compiler, Microsoft Visual
Studio 2008 or the Express version (cl, version 15.00.21022))

8. Android NDK

 

 

访问 http://developer.android.com/sdk/ndk/index.html 

下载最新的Android
NDK,是一个ZIP解压包,只需解压到有个别路径即可,例如”F:\android-ndk-r8b-windows\android-ndk-r8b”,再把那么些路子添加到系统的环境变量PATH中。

update: 近日本身利用的本子是:android-ndk-r10d

 

  1. 设置Cygwin(可以选取性安装,通过命令行实行编译C++代码, 不建议利用)

 

只要你是在windows上作开发,能够挑选设置,假设是在ubuntu上,则根本不供给安装。

 

在 那篇博客中,第②局地,介绍了采纳Cygwin的点子,但是此地不推荐使用,所以固然您想利用以来,请参考上边链接中的博客配置情势。

 

 

 

  

  

    4)Microsoft .NET Framework SDK version 1.0 or higher

10. OpenCV For Android

 

 

 

下载最新的opencv for android,

下载地址:

安装完事后最好布局环境变量。

 

(不安排环境变量也足以,能够直接在eclipse中内定opencv头文件的带有目录)

诠释: 方今精心看了下opencv for
android与opencv的差异,opencv4android也含有了opencv中的c++的头文件,所以一旦您以前的c/c++代码使用了opencv的头文件,那么毫不原来的opencv
也足以,因为opencv4android也有c/c++的头文件,只要你的工程安插能够找到那些头文件即可。此外,opencv4android中首要含有的是java版本的API,
都以.so链接库,.so 链接库是linux用的链接库文件。

 

***************

opencv4android中还带有了opencv.mk那样的2个make文件,那一个文件对此编写翻译本地opencv代码是尤其重庆大学的,假诺您不想用opencv4android的SDK,可是也要把那个SDK中的opencv.mk这几个文件复制到你的opencv目录或然其余目录,以往在
Android主次中布署NDK本地编写翻译的时候要求动用这么些文件。分外关键。

**********

 

 

7.在档次根目录下添加 pack-resources.bat . 然后保存运营

7.在档次根目录下添加 pack-resources.bat . 然后保存运维

    5)GNU make (3.79.1 or higher)

11. 在Android中使用Opencv

 

 

行使opencv有三种艺术,一种是利用opencv的java版本的API,可是那种艺术不是由此本地调用实现的,全体都以java代码,所以那边先不讲,别的一种办法正是选择opencv的c++版本的API,将地面c++代码编写翻译成.so链接库,然后在安卓支付中展开调用,本地cpp代码应用NDK进行编写翻译。

 

..\sciter-sdk\bin\packfolder.exe res resources.cpp -v "resources"
..\sciter-sdk\bin\packfolder.exe res resources.cpp -v "resources"

    6)zip tool (2.3 or higher)

11.1 安卓java代码

 

上面给出二个运用Canny算子检查和测试边缘的当地代码调用的采取方法。

新建筑和安装卓项目,配置使用安卓API等音信,那里作者的项目名称为HaveImgFun

下一场修改界面控制文件res->layout->activity_have_img_fun.xml

 

 

[html] view
plaincopy

 

  1. <?xml version=”1.0″ encoding=”utf-8″?>   
  2.      <LinearLayout   xmlns:android=””   
  3.       android:orientation=”vertical”   
  4.       android:layout_width=”fill_parent”    
  5.       android:layout_height=”fill_parent”   
  6.      >   
  7.      <Button android:layout_height=”wrap_content”    
  8.          android:layout_width=”fill_parent”    
  9.          android:id=”@+id/btnNDK”    
  10.          android:text=”使用C++ OpenCV实行处理” />   
  11.      <Button android:layout_height=”wrap_content”    
  12.          android:layout_width=”fill_parent”    
  13.          android:id=”@+id/btnRestore”    
  14.          android:text=”还原” />    
  15.      <ImageView android:id=”@+id/ImageView01″    
  16.      android:layout_width=”fill_parent”    
  17.      android:layout_height=”fill_parent” />         
  18.  </LinearLayout>  

在文件夹src下的com.testopencv.haveimgfun包中新建多个类用于包装采取了opencv
c++代码的动态库的导出函数,类名为LibImgFun。
Eclipse会为你成立三个新的文本LibImgFun.java,将内部的始末改为:

 

 

 

[java] view
plaincopy

 

  1. package com.testopencv.haveimgfun;   
  2.  public class LibImgFun {    
  3.  static {     
  4.          System.loadLibrary(“ImgFun”);     
  5.         }     
  6.        /**  
  7.              * @param width the current view width  
  8.              * @param height the current view height  
  9.  */   
  10.      public static native int[] ImgFun(int[] buf, int w, int h);    
  11.  }  

从下面的代码能够查出,大家的动态库名字应该为“libImgFun.so”,注意”public
static native int[] ImgFun(int[] buf, int w, int
h)”中的native关键字,证明这么些函数来自native
code。static代表那是2个静态函数,那样就能够直接用类名去调用。

 

 

修改功效代码,修改HaveImgFun.java的代码,代码内容如下:

 

 

[java] view
plaincopy

 

  1. package com.testopencv.haveimgfun;  
  2.   
  3. import android.app.Activity;  
  4. import android.graphics.Bitmap;  
  5. import android.graphics.Bitmap.Config;  
  6. import android.graphics.drawable.BitmapDrawable;  
  7. import android.os.Bundle;  
  8. import android.widget.Button;  
  9. import android.view.View;  
  10. import android.widget.ImageView;  
  11.   
  12. public class HaveImgFun extends Activity {  
  13.     /** Called when the activity is first created. */  
  14.     ImageView imgView;  
  15.     Button btnNDK, btnRestore;  
  16.   
  17.     @Override  
  18.     public void onCreate(Bundle savedInstanceState) {  
  19.         super.onCreate(savedInstanceState);  
  20.         setContentView(R.layout.activity_have_img_fun);  
  21.   
  22.         this.setTitle(“使用NDK转换灰度图”);  
  23.         btnRestore = (Button) this.findViewById(R.id.btnRestore);  
  24.         btnRestore.setOnClickListener(new ClickEvent());  
  25.         btnNDK = (Button) this.findViewById(R.id.btnNDK);  
  26.         btnNDK.setOnClickListener(new ClickEvent());  
  27.         imgView = (ImageView) this.findViewById(R.id.ImageView01);  
  28.         Bitmap img = ((BitmapDrawable) getResources().getDrawable(  
  29.                 R.drawable.lena)).getBitmap();  
  30.         imgView.setImageBitmap(img);  
  31.     }  
  32.   
  33.     class ClickEvent implements View.OnClickListener {  
  34.         public void onClick(View v) {  
  35.             if (v == btnNDK) {  
  36.                 long current = System.currentTimeMillis();  
  37.                 Bitmap img1 = ((BitmapDrawable) getResources().getDrawable(  
  38.                         R.drawable.lena)).getBitmap();  
  39.                 int w = img1.getWidth(), h = img1.getHeight();  
  40.                 int[] pix = new int[w * h];  
  41.                 img1.getPixels(pix, 0, w, 0, 0, w, h);  
  42.                 int[] resultInt = LibImgFun.ImgFun(pix, w, h);  
  43.                 Bitmap resultImg = Bitmap.createBitmap(w, h, Config.RGB_565);  
  44.                 resultImg.setPixels(resultInt, 0, w, 0, 0, w, h);  
  45.                 long performance = System.currentTimeMillis() – current;  
  46.                 imgView.setImageBitmap(resultImg);  
  47.                 HaveImgFun.this.setTitle(“w:” + String.valueOf(img1.getWidth())  
  48.                         + “,h:” + String.valueOf(img1.getHeight()) + “NDK耗时”  
  49.                         + String.valueOf(performance) + ” 毫秒”);  
  50.             } else if (v == btnRestore) {  
  51.                 Bitmap img2 = ((BitmapDrawable) getResources().getDrawable(  
  52.                         R.drawable.lena)).getBitmap();  
  53.                 imgView.setImageBitmap(img2);  
  54.                 HaveImgFun.this.setTitle(“使用OpenCV进行图像处理”);  
  55.             }  
  56.         }  
  57.     }  
  58. }  

只顾:那里由于不一样的门类名以及类名,恐怕在运作程序的时候唤醒某些类找不到,那就须求查阅AndroidManifest.xml那么些文件了,
AndroidMainfest.xml代码示例:

 

 

[html] view
plaincopy

 

  1. <?xml version=”1.0″ encoding=”utf-8″?>  
  2. <manifest xmlns:android=””  
  3.     package=”com.example.haveimgfun”  
  4.     android:versionCode=”1″  
  5.     android:versionName=”1.0″ >  
  6.   
  7.     <uses-sdk  
  8.         android:minSdkVersion=”8″  
  9.         android:targetSdkVersion=”18″ />  
  10.   
  11.     <application  
  12.         android:allowBackup=”true”  
  13.         android:icon=”@drawable/ic_launcher”  
  14.         android:label=”@string/app_name”  
  15.         android:theme=”@style/AppTheme” >  
  16.         <activity  
  17.             android:name=”com.example.haveimgfun.HaveImgFun”  
  18.             android:label=”@string/app_name” >  
  19.             <intent-filter>  
  20.                 <action android:name=”android.intent.action.MAIN” />  
  21.   
  22.                 <category android:name=”android.intent.category.LAUNCHER” />  
  23.             </intent-filter>  
  24.         </activity>  
  25.     </application>  
  26.   
  27. </manifest>  

上边的代码中钦命了程序运转时要求实例化的类,

[html] view
plaincopy

 

  1. android:name=”com.example.haveimgfun.HaveImgFun”  

 

地方那句代码要求根据分裂的项目名称以及类名实行修改,有时候会晤世类找不到的一无可取提醒。

 

 

 

 

    7)cat and sed tools

11.2 C++代码

 

在档次中新建三个jni文件,用于放置该项目的富有cpp代码。
在jni文件夹下建立三个”ImgFun.cpp”的公文,内容改为上边所示:

 

[cpp] view
plaincopy

 

  1. #include <jni.h>  
  2. #include <stdio.h>  
  3. #澳门金沙国际,include <stdlib.h>  
  4. #include <opencv2/opencv.hpp>  
  5. using namespace cv;  
  6. IplImage * change4channelTo3InIplImage(IplImage * src);  
  7.   
  8. extern “C” {  
  9. JNIEXPORT jintArray JNICALL Java_com_testopencv_haveimgfun_LibImgFun_ImgFun(  
  10.         JNIEnv* env, jobject obj, jintArray buf, int w, int h);  
  11. JNIEXPORT jintArray JNICALL Java_com_testopencv_haveimgfun_LibImgFun_ImgFun(  
  12.         JNIEnv* env, jobject obj, jintArray buf, int w, int h) {  
  13.   
  14.     jint *cbuf;  
  15.     cbuf = env->GetIntArrayElements(buf, false);  
  16.     if (cbuf == NULL) {  
  17.         return 0;  
  18.     }  
  19.   
  20.     Mat myimg(h, w, CV_8UC4, (unsigned char*) cbuf);  
  21.     IplImage image=IplImage(myimg);  
  22.     IplImage* image3channel = change4channelTo3InIplImage(&image);  
  23.   
  24.     IplImage* pCannyImage=cvCreateImage(cvGetSize(image3channel),IPL_DEPTH_8U,1);  
  25.   
  26.     cvCanny(image3channel,pCannyImage,50,150,3);  
  27.   
  28.     int* outImage=new int[w*h];  
  29.     for(int i=0;i<w*h;i++)  
  30.     {  
  31.         outImage[i]=(int)pCannyImage->imageData[i];  
  32.     }  
  33.   
  34.     int size = w * h;  
  35.     jintArray result = env->NewIntArray(size);  
  36.     env->SetIntArrayRegion(result, 0, size, outImage);  
  37.     env->ReleaseIntArrayElements(buf, cbuf, 0);  
  38.     return result;  
  39. }  
  40. }  
  41.   
  42. IplImage * change4channelTo3InIplImage(IplImage * src) {  
  43.     if (src->nChannels != 4) {  
  44.         return NULL;  
  45.     }  
  46.   
  47.     IplImage * destImg = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, 3);  
  48.     for (int row = 0; row < src->height; row++) {  
  49.         for (int col = 0; col < src->width; col++) {  
  50.             CvScalar s = cvGet2D(src, row, col);  
  51.             cvSet2D(destImg, row, col, s);  
  52.         }  
  53.     }  
  54.   
  55.     return destImg;  
  56. }  

在地点的代码中,给出了简单的Canny算子检查和测试边缘的代码,并且重返检查和测试后的图像呈现。
上边的代码中#include <jni.h>是需要求含有的头文件,#include
<opencv2/opencv.hpp>是opencv要包罗的头文件。

 

 

注释: 1. 

[cpp] view
plaincopy

 

  1. JNIEXPORT jintArray JNICALL Java_com_testopencv_haveimgfun_LibImgFun_ImgFun(  
  2.         JNIEnv* env, jobject obj, jintArray buf, int w, int h)</span></span>  

 

 

本条函数名,必须与java代码中的包名以及类名,函数名完全一致,

[cpp] view
plaincopy

 

  1. Java_com_testopencv_haveimgfun_LibImgFun_ImgFun  

 

独家表示了包,类,函数名,中间用_分开,那一个是相当主要的,不然会唤起找不到函数的非凡错误。

 

2.
 eclipse很奇怪,或然是本身的安排难点,作者当然早就安顿好了opencv的目录,可是一旦不配置eclipse工程的隐含目录,是找不到opencv头文件的。

 

[cpp] view
plaincopy

 

  1. #include <opencv2/opencv.hpp>  

 

那行代码,假若不配置eclipse工程中的包罗目录,找不到系统环境变量中的opencv目录,那些只要各位有消除办法,还请多多指教。

倘诺 给工程添加包蕴目录,唯有添加了含有目录,才能找到相应的头文件:

此间包罗的头文件的目录既可以是opencv4android的c++头文件目录,也足以是在此以前您曾经配备好的opencv目录

 

上面包车型大巴截图中,是自己的花色的安插,那里需求包含NDK中的若干新式版本的头文件,以及部分正规的c/c++的头文件,个中,标准的c/c++的头文件,会在将android项目转移为c/cpp项指标进度中活动抬高。请我们根据自身的体系安排以及文件存放目录对应的改动。原来的配置表明中动用的版本都太古老了。。。(上面第贰张图是风靡的安顿截图,第一张图是原来的计划截图,放在这里仅供参考相比。)

尤其注意:所以的布置中,都要让您的花色找到opencv的jni的目录,那样才能运用opencv的c/c++
对应的头文件。

澳门金沙国际 13

澳门金沙国际 14

 

 

11.3 配置文件

下一场再在jni下新建四个文本”Android.mk”文件和”Application.mk”文件,那八个文件事实上正是简单的Makefile文件。
利用NDK进行编译的时候,要求选择Android.mk和Application.mk四个文件。
Android.mk:

 

[html] view
plaincopy

 

  1. LOCAL_PATH := $(call my-dir)    
  2. include $(CLEAR_VARS)    
  3. OPENCV_LIB_TYPE:=STATIC  
  4. ifeq (“$(wildcard $(OPENCV_MK_PATH))”,””)    
  5. #try to load OpenCV.mk from default install location    
  6. include E:\java\OpenCV-2.4.5-android-sdk\sdk\native\jni\OpenCV.mk   
  7. else    
  8. include $(OPENCV_MK_PATH)    
  9. endif    
  10. LOCAL_MODULE    := ImgFun  
  11. LOCAL_SRC_FILES := ImgFun.cpp    
  12. include $(BUILD_SHARED_LIBRARY)   

Application.mk:

 

 

[html] view
plaincopy

 

  1. APP_STL:=gnustl_static    
  2. APP_CPPFLAGS:=-frtti -fexceptions    
  3. APP_ABI:=armeabi armeabi-v7a </span>  

在Android.mk文件中,供给注重修改的代码是之类一行:

 

 

[html] view
plaincopy

 

  1. include E:\java\OpenCV-2.4.5-android-sdk\sdk\native\jni\OpenCV.mk  

那边要钦命到opencv.mk这么些文件,不然在NDK展开编写翻译本地c/c++
文件得时候会提示您找不到opencv.mk这几个文件。不用您把opencv.mk放到哪个地方,只要用相对只怕相对目录加载进来就能够。

 

尤其注意:那里一定要在Android.mk文件中包涵正确的opencv中的OpenCV.mk文件,因为那个OpenCV.mk文件配置了什么行使opencv中的动态链接库。并且经过那么些文件把opencv中的c/cpp的链接库文件复制到了android项目中,在anroid项目周转的时候才能找到地点的native
code对应的函数。也便是说,通过OpenCV.mk文件,在编写翻译本地c/cpp文件的时候才能找到当地c/cpp代码所选取的opencv函数的链接库。

 

而是,因为本人事先是在Windows上作开发,所以混合使用native code和 opencv 的
java SDK是从未问题的,不用手动copy opencv4android
的libopencv_java.so文件也能自行的把那几个文件复制过去,不过如今本人在ubuntu上安排的时候,发现最大的三个题材就是当混合使用native
code和java sdk的时候, 没有机关的给android项目添加
libopencv_java.so那么些库文件,而且当手动把公文添加到android项目标libs目录后NDK在
build本地代码的时候会自动把手动添加的库文件删了。。。WTF,
这些难点困扰了自个儿好久,也找了成千成万材质,可是都不是太美丽,最后依然看NDK的文书档案把标题一举成功了,那里衷心不精晓为啥在Ubuntu下安顿利用opencv
java SDK会有标题,不会自行的复制.so文件。。。

 

时下,仅仅使用native
code不须求关怀下边提议的标题,上面的难题会单独写3个blog给出化解办法。

 

 

然后须求选用LOCAL_SRC_FILES包罗须求编写翻译的公文。全体的c/c++
文件都要分头列出来。

 

[html] view
plaincopy

 

  1. LOCAL_MODULE    := ImgFun  

上面一行代码用来内定生成的链接库的称号。

 

 

11.4 编写翻译本地C++代码

 

编写翻译本地C++代码能够采取Cygwin进行编写翻译,cd
到花色目录,然后运维ndk-build
也足以选择windows控制台进行编写翻译,同样cd到项目目录,运转ndk-build
还足以行使Eclipse进行编写翻译,建议配置使用Eclipse举办编写翻译,那样当项目标本土cpp代码爆发变化的时候就足以兑现全自动的cpp代码编写翻译,不用每趟都在命令行中手动的举办编写翻译,就算应用黑乎乎的吩咐行手动编写翻译,输出一堆音信显着很牛逼的规范。

(以下内容,尽管选取cygwin进行编写翻译,则不供给展开操作,直接动用cygwin恐怕命令行举办编写翻译,保险编写翻译通过之后即可运营程序,如若采纳使用Eclipse自动举行编写翻译,则参考以下内容进行配备)

第贰须求将该品种转移到C++项目,使得该类型拥有C++代码属性,如下所述。
点击项目,右击,New -> Other -> C/C++ -> Convert to a C/C++
Project.

 

澳门金沙国际 15

 

澳门金沙国际 16

 

澳门金沙国际 17

 

配置Eclipse对cpp代码进行编写翻译:
先是需求给当下项目增进1个编写翻译环境变量
如下目录
open Eclipse menu Window -> Preferences -> C/C++ -> Build ->
Environment,
点击Add… 
加上多少个NDKROOT,并且设置值为NDK的根目录。
接下来设置编写翻译的局地参数
Project Properties -> C/C++ Build, uncheck Use default build command,
replace “Build command” text from “make” to
“${NDKROOT}/ndk-build.cmd” on Windows,
“${NDKROOT}/ndk-build” on Linux and MacOS.

澳门金沙国际 18

 

接下来修改Behaviour选项卡,设置编写翻译配置(配置在保存代码的时候进行自动编写翻译):

 

澳门金沙国际 19

 

点击显著,然后确认NDK(ndk-build)编写翻译能够健康开始展览编译,
能够见到下图:

澳门金沙国际 20

 

其一时半刻候,会在C++代码中,看到那多少个多的一无所长提示,随地都以不当提醒,那里并非慌,那里只是假的失实提醒,编译cpp代码能够编译通过,然而运行程序是十分的,会提醒您代码有错误,要求缓解那几个标题。

 

澳门金沙国际 21

 

 

开拓工程属性,Project Properties -> C/C++
General -> Paths and Symbols

为GNC
C++编译器添加如下路径:(那里丰盛的路径正是NDK 中的c/c++
头文件的门径)

 

 

[html] view
plaincopy

 

  1. # for NDK r8 and prior:  
  2. ${NDKROOT}/platforms/android-9/arch-arm/usr/include  
  3. ${NDKROOT}/sources/cxx-stl/gnu-libstdc++/include  
  4. ${NDKROOT}/sources/cxx-stl/gnu-libstdc++/libs/armeabi-v7a/include  
  5. ${ProjDirPath}/../../sdk/native/jni/include  

 

[html] view
plaincopy

 

  1. # for NDK r8b and later:  
  2. ${NDKROOT}/platforms/android-9/arch-arm/usr/include  
  3. ${NDKROOT}/sources/cxx-stl/gnu-libstdc++/4.6/include  
  4. ${NDKROOT}/sources/cxx-stl/gnu-libstdc++/4.6/libs/armeabi-v7a/include  
  5. ${ProjDirPath}/../../sdk/native/jni/include  

 

接下来就会看到有着的一无所能都流失了,这样重复编写翻译本地cpp代码,然后就足以运作工程了。

 

诠释:上边的头文件配置路径都以相比较古老的了,最新的安插请看下图:

澳门金沙国际 22

 

 

到底能够运作程序了,能够看出本程序的截图如下:(由于采纳的虚拟机,所以运维速度相比较慢)

 

澳门金沙国际 23

 

澳门金沙国际 24

 

 

**************************************************************************************************************************************************************************************

注明:下面的印证都是用的opencv
 的c/c++版本的头文件以及代码,借使你用opencv4android中提供的事例,例子里面都用到opencv4android的java版本的API,这样你须要给工程安插Library,才能编写翻译通过,小编在初期的品尝中,都内定了API,但是一会API那3个路径就改成叉叉了,后来发现,eclipse中务要求把libray这些工程投入进去,才能正确的加载library,
那样,你的eclipse必须把opencv4android中的Android版本的library那么些工程加进去才足以。小编用的opencv4android
2.4.6的版本, 这一个本子的library工程名称为OpenCV Library –
2.4.6,必须在eclipse中把那一个工程导入才得以成功的引用opencv4android
的java版本SDK

不无的引用 import org.opencv.core.Rect;
那连串型的包的文件,都证实这么些工程分包了opencv4android的java版本的API,要求配备library.

而且还索要配置Android SDK 版本(不然编写翻译提醒出错)

澳门金沙国际 25

 

8.将 sciter.dll 移动到输出目录,即可编写翻译运营

8.将 sciter.dll 移动到输出目录,即可编写翻译运营

 

Q & A:

 

在博客评论中,干扰很四个人的难点有:

 

1. 众多个人关系了cbuf = env->GetIntArrayElements(buf, false);
编写翻译可是,那些理应是NDK版本的标题,其实自身也绝非仔细去查资料,到底是何等难点,由此可知把标题一挥而就了就能够了,作者在重新配置的时候也赶上了这么些难点,无非正是传播的参数和函数可以接到的参数不匹配,那么给它传三个非常的就好了。

 

到现在改成了:
cbuf = env->GetIntArrayElements(buf, NULL);
如此就足以编写翻译通过了

 

 

  1. 生成SDK配置

    打开dos命令行,
定位到SDK目录:D:\LibreOffice\sdk,执行setsdkenv_windows.bat批处理文件,它用来布局SDK环境。当第①次运维这一个批处理,它会要求您输入一些门道,配置步骤3装置工具的对应路径即可。

    配置成功后:

   
澳门金沙国际 26

  1. 生成LibreOffice SDK 头文件(C++)

    C++基于LO SDK的开销供给SDK所提供的C++头文件。

    D:\LibreOffice\sdk\bin 目录下cppumaker.exe
工具。基于UNO组件的反光机制来生成那一个头文件。

    命令如下:

    D:\LibreOffice\sdk\bin>cppumaker.exe -Gc -O
“D:\LibreOffice\sdk\include” “D:\Lib reOffice\URE\misc\types.rdb”
“D:\LibreOffice\program\types\offapi.rdb”。

 

  1. LibreOffice SDK中
    D:\LibreOffice\sdk\examples\cpp\DocumentLoader\DocumentLoader.cxx
    例子分析

    1)VS新建win32 控制台应用程序

    2)配置项目include目录:D:\LibreOffice\sdk\include,
lib目录:D:\LibreOffice\sdk\lib

    2)DocumentLoader.cxx源码拷贝到新建的花色中

   
3)添加命令行参数-env:URE_MORE_TYPES=”file:///D:/LibreOffice/program/types/offapi.rdb”
“file:///D:/LibreOffice/sdk/examples/cpp/DocumentLoader/test.odt”

    澳门金沙国际 27

    4)项目链接添加lib重视:Version.lib isal.lib isalhelper.lib
icppu.lib icppuhelper.lib comsupp.lib

    澳门金沙国际 28

   
5)运行项最近先运行Soffice进程,进入命令行窗体,再进来到相对应目录运营soffice
-accept=socket,host=localhost,port=2083;urp;StarOffice.ServiceManager

  澳门金沙国际 29

继之运转品种,旗开马到!

相关文章