您的位置:新葡亰496net > 电脑系统 > 新葡亰496net:Windows创建Sciter的第一个程序,代码

新葡亰496net:Windows创建Sciter的第一个程序,代码

发布时间:2019-07-21 20:56编辑:电脑系统浏览(140)

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

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

    原文地址:

    如何使用Eclipse编译C,C ,JAVA程序

    平台: Windows 10

    下面是个人配置SDK开发经验

     

      

    IDE : Visual studio 2017

    1. 下载LibreOffice与SDK

    有一种方式不需要自己配置所有的Sun JDK, Android SDK以及NDK,Eclipse等设置,使用已经配置好的开发套件就可以进行直接的开发,由NVIDIA开发的开发套件Tegra Android Development Pack能够直接设置好所有的开发环境,而且最新的版本还包含了OPENCV,不想自己配置的朋友可以直接下载这个套件。但是我本人没有尝试过使用这个套件,怎么使用也不明白,所以如果不想自己配置环境的话还是需要自己去看看这个套件的使用。

    一、编译环境配置

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

        链接:

     

    J2SE(TM) Development Kit(JDK)的介绍及下载安装

    创建流程. 

     

     

    JDK的介绍:

    J2SE(TM) Development Kit简称JDK,是整个Java的核心,包括了Java运行环境(Java Runtime Environment),一堆Java工具和Java基础的类库(rt.jar)。不论什么Java应用服务器实质都是内置了某个版本的JDK。最主流的JDK是Sun公司发布的JDK,除了Sun之外,还有很多公司和组织都开发了自己的JDK,例如IBM公司开发的JDK,BEA公司的Jrocket,还有GNU组织开发的JDK等等。

    总结一下关键点. (注意:官网教程里的SDK目录和项目目录是同级目录,所以使用了相对路径,实际项目中要依据情况更改)

    1. 安装LibreOffice与SDK

     

    JDK的下载

    用户可以上SUM的网站下载JDK最新版。目前版本为JDK 5.0 Update 9

    下载地址: (选择JDK 5.0 Update 9下载)

     

    1. 将 sciter-sdkinclude 加入包含目录

        安装过程比较简单,若要更改安装目录时则改成指定的安装目录即可,其它都是默认安装。

    1. Sun JDK

     

     

    首先需要安装java开发环境,这里必须使用Sun JDK,不能使用Opencv JDK. 安卓开发不支持Opencv JDK.

    JDK下载地址:

    建议下载稳定版本的J2SE.

    安装好 Sun JDK后需要按照java JDK的安装方式配置环境变量。

    设置JDK系统环境变量:

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

    JAVA_HOME= C:Program FilesJavajdk1.X.XXX
    Path=…..; %JAVA_HOME%bin

     

    新葡亰496net 1

     

     

    JDK的安装

    JDK的安装采取默认安装即可顺利完成。

     

    JDK安装的同时会顺便安装J2SE的Runtime,也采用默认安装即可。

     

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

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

    2. Android SDK

     

     

    安装安卓开发用的SDK,可以从    这里下载最新的SDK。下载完毕后解压缩到一个不包含空格的目录即可。建议使清晰明了的目录,以后还要用。

    建议将SDK安装到独立的文件夹中,文件夹名不要有空格,也不要起中文名字。

    Android SDK 不用配置系统环境变量,在Eclipse中创建Android的工程时候或者安装完ADT(Android Development Tools)之后会提示配置Android  SDK 目录。这里只要保证目录名字不包含空格就可以了。

     

     

    MinGW的介绍及下载安装

    1. 更改DPI 识别选项

        LibreOffice安装路径:D:LibreOffice

    3. Eclipse

     

     

    下载Eclipse作为开发用的IDE

    下载地址:

    提示:最新发现下载的ADT中包含了最新版本Eclipse,可以不用下载。

     

     

    MinGW的介绍:

    MinGW (Minimalist GNU for Windows)是一个自由软件(free software),可以将C/C 撰写的原始程序编译为Windows环境下的可执行档。它所使用的编译器(如C语言的gcc或C 语言的g 等)是由GCC移植而来。GCC的意思是GNU编译器聚集(GNU Compiler Collection),这个聚集中包括C、C 、Objective-C、Fortran、Java、Ada等语言的编译器及相关的函式库等必要的档案。GCC被誉为世界上最重要的软件之一,它由理察•马修•斯托曼(Richard Matthew Stallman,简称 RMS)在1987年开始建立,以作为GNU(GNU’s Not Unix)自由软件计划的编译器。根据GNU自由软件的精神,任何人都可以免费取得GCC与MinGW,并且在符合GNU通用公共许可证(GPL, GNU General Public License)的情况下,自由的使用、复制、修改和散布GCC及MinGW。

    MinGW又称MinGW32,在不需要第三方(third-party)动态链接函式库(DLL, Dynamic Link Library)支持的情况下,它可以将C、C 等程序,编译为可以在Windows Win32平台上执行的程序。

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

        SDK安装路径:D:LibreOfficesdk

    4. Android Development Tools(ADT)

     

     

    下载安卓开发工具包,包含一些常用的开发工具。

    也可以直接使用Eclipse在线安装,但下载后再装比较方便,速度快。

    下载地址: 

     

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

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

     

    新葡亰496net 2

     

    安装ADT时的截图如下:

     

    新葡亰496net 3

     

     

    这个时候会看到两类组件,一类是Develop Tools,还有就是NDT Plugins,NDT Plugins是本地编程编译工具,也就是用来编译本地C 代码的,建议将两组工具都全部安装。

    特别说明:如果你需要做本地C 开发的话,一定要把NDT Plugins勾选上。(注释:安装的时候务必选择NDK Plugins)

     

    新葡亰496net 4

     

     

    MinGW的下载

           用户可以直接登陆以下地址下载MinGW

          

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

    3. 安装完SDK后,可根据SDK目录下的docinstall.html里面的链接下载并安装必要的工具。

    5. 配置Eclipse

     

     

    ADT安装完毕,应该可以在Eclipse工具栏和Window菜单上找到Android SDK管理器的图标

     

    新葡亰496net 5

     

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

     

    新葡亰496net 6

     

    设置安卓开发的SDK目录,这里需要将SDK目录指定到刚才我们下载的Android SDK目录的根目录。

     

    新葡亰496net 7

     

     

    在Eclipse中选择Windows->Android SDK Manager,可以管理下载的SDK,也可以下载最新的SDK,用于不同的SDK平台开发。

    选择你所需要开发的平台的SDK(我最早下载的那个SDK包含了很多版本的SDK,但是最新下载的最新的SDK,结果只包含了很好的Android 4.3的API,很多都需要自己下载)

     

    新葡亰496net 8

     

     

    MinGW的安装

    鼠标双击执行安装文件,选择“Download and Install”

     

    选择软件安装的版本,这里我们选择“Candidate”

     

    接着我们选择安装的编译器

     

    选择安装的路径

     

    开始下载软件版本及安装

     

    // 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,建议根据自己的配置需要进行测试,我有一次使用了模拟GPU,结果模拟器的图像显示完全不正常)

     

    新葡亰496net 9

     

    新葡亰496net 10

     

    新葡亰496net 11

     

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

    MinGW的设置

    先将MinGW安装目录bin底下的 mingw32-make.exe更名为make.exe

    接着右键点击“我的电脑”选择属性,再选择“高级”一栏

     

    点击环境变量按钮

     

    在系统变量里面的Path添加“MinGW安装目录bin;”(例如;C:MinGWbin;)

     

    接着重新启动系统完成配置。

     

        1)LibreOffice与SDK

    上面部分主要介绍了Android开发环境的基本配置步骤,下面将要通过示例,讲解如何配置NDK进行本地JNI调用。

     

     

     

     

    二、Eclipse SDK的介绍及下载

    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。

     

    新葡亰496net 12

     

     

     

    Eclipser的介绍

    Eclipse 是替代IBM Visual Age for Java(以下简称IVJ)的下一代IDE开发环境,但它未来的目标不仅仅是成为专门开发Java程序的IDE环境,根据Eclipse的体系结构,通过开发插件,它能扩展到任何语言的开发,甚至能成为图片绘制的工具。目前,Eclipse已经开始提供C,C ,Ruby语言开发的功能插件。更难能可贵的是,Eclipse是一个开放源代码的项目,任何人都可以下载Eclipse的源代码,并且在此基础上开发自己的功能插件。同时可以通过开发新的插件扩展现有插件的功能,比如在现有的Java开发环境中加入Tomcat服务器插件。可以无限扩展,而且有着统一的外观,操作和系统资源管理,这也正是Eclipse的潜力所在。

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

        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-windowsandroid-ndk-r8b",再把这个路径添加到系统的环境变量PATH中。

    update: 目前我使用的版本是:android-ndk-r10d

     

    1. 安装Cygwin(可以选择性安装,通过命令行进行编译C 代码, 不建议使用)

     

    如果你是在windows上作开发,可以选择安装,如果是在ubuntu上,则根本不需要安装。

     

    在 这篇博客中,第三部分,介绍了使用Cygwin的方法,但是这里不推荐使用,所以如果你想使用的话,请参考上面链接中的博客配置方式。

     

     

     

    Eclipse SDK下载

     

    用户可以直接登陆Eclipse的官方网站( )下载Eclipse最新版本。下载完后用户只需释放压缩包直接运行eclipse.exe 即可启动Eclipse。

      

        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这样的一个make文件,这个文件对于编译本地opencv代码是非常重要的,如果你不想用opencv4android的SDK,但是也要把这个SDK中的opencv.mk这个文件复制到你的opencv目录或者其他目录,将来在 Android程序中配置NDK本地编译的时候需要使用这个文件。非常重要。

    **********

     

     

    Eclipse SDK的设置

    第一次启动Eclipse 的时候需要选择workspace的文件夹。

     

     

    接着进入Eclipse的欢迎界面

     

    点击Workbench 进入Eclipse的开发界面。

     

    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进行编译。

     

    三、C/C Development Tools (CDT)插件的安装

    ..sciter-sdkbinpackfolder.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表示这是一个静态函数,这样就可以直接用类名去调用。

     

     

    修改功能代码,修改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"  

     

    上面这句代码需要根据不同的项目名称以及类名进行修改,有时候会出现类找不到的错误提示。

     

     

    CDT的下载

    用户可以直接在Eclipse的网站上面找到CDT插件的压缩包,然后下载至电脑硬盘上;

    下载地址:( )

     

        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  

     

    分别表示了包,类,函数名,中间用_新葡亰496net,分开,这个是非常重要的,否则会提示找不到函数的异常 错误。

     

    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 对应的头文件。

    新葡亰496net 13

    新葡亰496net 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:javaOpenCV-2.4.5-android-sdksdknativejniOpenCV.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:javaOpenCV-2.4.5-android-sdksdknativejniOpenCV.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不需要关心上面提出的问题,上面的问题会单独写一个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.

     

    新葡亰496net 15

     

    新葡亰496net 16

     

    新葡亰496net 17

     

    配置Eclipse对cpp代码进行编译:
    首先需要给当前项目添加一个编译环境变量
    如下目录
    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.

    新葡亰496net 18

     

    然后修改Behaviour选项卡,设置编译配置(配置在保存代码的时候进行自动编译):

     

    新葡亰496net 19

     

    点击确定,然后确认NDK(ndk-build)编译能够正常进行编译,
    可以看到下图:

    新葡亰496net 20

     

    这个时候,会在C 代码中,看到非常多的错误提示,遍地都是错误提示,这里不要慌,这里只是假的错误提示,编译cpp代码能够编译通过,但是运行程序是不行的,会提示你代码有错误,需要解决这些问题。

     

    新葡亰496net 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代码,然后就可以运行工程了。

     

    注释:上面的头文件配置路径都是比较古老的了,最新的配置请看下图:

    新葡亰496net 22

     

     

    终于可以运行程序了,可以看到本程序的截图如下:(由于使用的虚拟机,所以运行速度比较慢)

     

    新葡亰496net 23

     

    新葡亰496net 24

     

     

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

    注释:上面的说明都是用的opencv  的c/c 版本的头文件以及代码,如果你用opencv4android中提供的例子,例子里面都用到opencv4android的java版本的API,这样你需要给工程配置Library,才能编译通过,我在最初的尝试中,都指定了API,但是一会API那个路径就变成叉叉了,后来发现,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 版本(否则编译提示出错)

    新葡亰496net 25

     

    CDT的安装

    把CDT的压缩包解压至Eclipse的/ext/cdt下,目录结构如下:

     

    接着在extcdteclipse下用记事本创建一个 .eclipseextension 文件,内容如下

    name=CDT

    id=org.eclipse.cdt

    version=3.1.1

    启动Eclipse ,点击菜单栏的Help / Software Updates / Manage Configuration选项

     

    启动Eclipse的插件配置窗口

     

    新葡亰496net:Windows创建Sciter的第一个程序,代码开发配置方法。点击“Add an Extension Location”从硬盘添加CDT插件,选择CDT的路径;

     

    重启Eclipse

     

    在Eclipse的菜单栏中找到window / Open Perspective / Other 点击

     

    添加C/C 的Perspective

     

    以上步骤基本完成CDT插件的添加

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

     

    Q & A:

     

    在博客评论中,困扰很多人的问题有:

     

    1. 很多人提到了cbuf = env->GetIntArrayElements(buf, false); 编译不过,这个应该是NDK版本的问题,其实我也没有仔细去查资料,到底是什么问题,总之把问题解决了就可以了,我在重新配置的时候也遇到了这个问题,无非就是传入的参数和函数可以接收的参数不匹配,那么给它传一个匹配的就好了。

     

    现在改成了:
    cbuf = env->GetIntArrayElements(buf, NULL);
    这样就可以编译通过了

    四、C、C 程序的编译

    新建一个C 项目 点击菜单栏上的 File / New / Standard Make C Project

    如果想建立一个C项目则选择Standard Make C Project;

     

    输入New Project名字,直接按Finish完成Project添加

     

    给项目新建一个的源文件,点击菜单栏上的 File / New / File

     

    接着出现文件添加的窗口,在File Name栏里面写上文件名

    C 的源文件后缀名为cpp 如hello.cpp

    而C的源文件后缀名为c 如hello.c

     

    编辑刚刚添加的hello.cpp 文件,添加一段C 的代码,内容如下:

    #include <iostream>

    using namespace std; 

     

    int main() 

        cout<<"hello world!!n"; 

        system("pause");

     

     

    若你新建的项目为C的话,则需添加相应的C代码,内容如下:

    #include "stdio.h"

    int main(){

           printf("Hello world!n");

           system( "pause" );

           }

     

    添加一个编译命令

    Target Name:MAKE FILE

    Builder Command:g hello.cpp -g -o run

    这里如果是c环境就改成gcc hello.c -g -o run

    ->

    双击MAKE FILE,此时Eclipse在项目文件的根目录创建一个run.exe的文件,此文件根据hello.cpp代码编译生成。

    双击run.exe可以预览效果。

    -> ->

     

    1. 生成SDK配置

    五、JAVA程序的编译

    新建一个Java Project

     

    这里只需填写Project name然后按Finish按钮完成Project添加。

     

     

    接着新建一个Class文件

     

    只需在Name的项里写上Hello ,然后直接按Finish按钮

     

    打开我们刚刚添加完成的Hello.java文件,写上相应的Java代码

     

    接着点击菜单栏Run / Run As / Java Application 执行Java的编译命令

     

    程序成功运行的话,在Eclipse下端的Console窗口将会输出Hello World!信息

     

     

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

        配置成功后:

        新葡亰496net 26

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

        C 基于LO SDK的开发需要SDK所提供的C 头文件。

        D:LibreOfficesdkbin 目录下cppumaker.exe 工具。基于UNO组件的反射机制来生成这些头文件。

        命令如下:

        D:LibreOfficesdkbin>cppumaker.exe -Gc -O "D:LibreOfficesdkinclude" "D:Lib reOfficeUREmisctypes.rdb" "D:LibreOfficeprogramtypesoffapi.rdb"。

     

    1. LibreOffice SDK中 D:LibreOfficesdkexamplescppDocumentLoaderDocumentLoader.cxx 例子分析

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

        2)配置项目include目录:D:LibreOfficesdkinclude, lib目录:D:LibreOfficesdklib

        2)DocumentLoader.cxx源码拷贝到新建的项目中

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

        新葡亰496net 27

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

        新葡亰496net 28

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

      新葡亰496net 29

    接着运行项目,大功告成!

    本文由新葡亰496net发布于电脑系统,转载请注明出处:新葡亰496net:Windows创建Sciter的第一个程序,代码

    关键词:

上一篇:xise最新版下载,0版本官方网址

下一篇:没有了