[转载]android-library_东京大雪_新浪博客

mikel阅读(1015)

[转载]android-library_东京大雪_新浪博客.

用eclipse开发的话,在工程右击-properties-Android最下面,有个Is library,选择后-apply确定,就是将此工程公开可以给别的工程使用,比如别的工程通过同样的步骤,在Is library旁边有个add按钮,点击后就可以将刚才选择了Is library的工程添加进来。那么你就可以在gen文件夹下面看到出现了一个新的包名,新的R文件,就是你选择Is library的包名以及R文件,你就可以通过使用那个共享工程的资源了。这个一般会使用在可以换肤的项目中或者是项目蛮大,有个工程专门用来存放资源,别的有4-5个工程都可以使用此共享资源。
另外一种就相当于链接库了:
可以链接jar包文件,工程右击-properties-Java Build Path-Libraries-Add JARs/Add library可以导入jar包供程序使用。

 

 

 

创建Android library,并且在工程中使用此library提供的资源,具体步骤如下:
1. 创建一个Android工程,命名为MyLib
2. 进入工程设置 properties-Android 选中Is Library

3. 创建另一个Android工程,命名为MyProj
4. 进入工程设置,添加MyLib

5. 在MyProj的AndroidManifest.xml中加入对library中activity的引用
<activity android:name=”net.devdiv.mylib.MyLib” />

 
6. 由于编译后library中的资源和引用它的project资源是合并在一起的,为了避免重名问题,需要对library中资源进行重命名
1). 把main.xml改为mylib.xml,同时修改MyLib.java代码setContentView(R.layout.mylib);
2). strings.xml修改为
<?xml version=”1.0″ encoding=”utf-8″?>
<resources>
  <string name=”mylibhello”>String fetched from lib!</string>
  <string name=”mylib_app_name”>MyLib</string>
</resources>
7. 在MyProj中引用MyLib的资源

package net.devdiv.myproj;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
import net.devdiv.mylib.*;
import android.content.Intent;

public class MyProj extends Activity {
   
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        TextView tv = (TextView)findViewById(R.id.myprojtext);
       tv.setText(R.string.mylibhello);
        
        Intent it = new Intent(this, MyLib.class);
        startActivity(it);
    }
}

[转载]android开发学习---layout布局、显示单位和如何进行单元测试 - Hi_Amos - 博客园

mikel阅读(1097)

[转载]android开发学习—layout布局、显示单位和如何进行单元测试 – Hi_Amos – 博客园.

一、五大布局(layout)

Android中的用五大布局:LinearLayout (线性布局)、AbsoluteLayout(绝对布局)、RelativeLayout(相对布局)、TableLayout(表格布局)、FrameLayout(帧布局)

1.LinearLayout 线性布局,将模块以线性进行排序

LinearLayout以你为它设置的垂直或水平的属性值,来排列所有的子元素。所有的子元素都被堆放在其它元素之后,因此一个垂直列表的每一行只会有 一个元素,而不管他们有多宽,而一个水平列表将会只有一个行高(高度为最高子元素的高度加上边框高度)。LinearLayout保持子元素之间的间隔以 及互相对齐(相对一个元素的右对齐、中间对齐或者左对齐)。

2.AbsoluteLayout 绝对布局,常用于游戏开发

AbsoluteLayout 可以让子元素指定准确的x/y坐标值,并显示在屏幕上。(0, 0)为左上角,当向下或向右移动时,坐标值将变大。AbsoluteLayout 没有页边框,允许元素之间互相重叠(尽管不推荐)。我们通常不推荐使用 AbsoluteLayout ,除非你有正当理由要使用它,因为它使界面代码太过刚性,以至于在不同的设备上可能不能很好地工作。

 3.RelativeLayout 相对布局,对于界面适配很有帮助

RelativeLayout 允许子元素指定他们相对于其它元素或父元素的位置(通过ID 指定)。因此,你可以以右对齐,或上下,或置于屏幕中 央的形式来 排列两个元素。元素按顺序排列,因此如果第一个元素在屏幕的中央,那么相对于这个元素的其它元素将以屏幕中央的相对位置来排列。如果使用XML 来指定这 个 layout ,在你定义它之前,被关联的元素必须定义。

4.FrameLayout 帧布局,类似html中的div层,视频播放中的帧

FrameLayout是最简单的一个布局对象。它被定制为你屏幕上的一个空白备用区域,之后你可以在其中填充一个单一对象 — 比如,一张你要发布的图片。所有的子元素将会固定在屏幕的左上角;你不能为FrameLayout中的一个子元素指定一个位置。后一个子元素将会直接在前 一个子元素之上进行覆盖填充,把它们部份或全部挡住(除非后一个子元素是透明的)。

5.TableLayout 表格布局

TableLayout 将子元素的位置分配到行或列中。一个TableLayout 由许多的TableRow 组成,每个TableRow都会定义一个 row (事实上,你可以定义其它的子对象,这在下面会解释到)。TableLayout 容器不会显示rowcloumns 或cell 的边框线。每个 row 拥有0个或多个的cell ;每个cell 拥有一个View 对象。表格由列和行组成许多的单元格。表格允许单元格为空。单元格不能跨列,这与HTML 中的不一样。

 

二、Android中的显示单位

 1.px (pixels)像素

     一般HVGA代表320×480像素,开发时这个用的比较多,因为屏幕越小启动速度越快。

2.dip或dp (device independent pixels)设备独立像素

    这个和设备硬件有关,一般为了支持WVGAHVGAQVGA 推荐使用这个,不依赖像素。

3.sp (scaled pixels — best for text size)比例像素

    主要处理字体的大小,可以根据系统的字体自适应。

4.除了上面三个显示单位,下面还有几个不太常用:

in (inches)英寸
mm (millimeters)毫米 
pt (points)点,1/72英寸
为了适应不同分辨率,不同的像素密度,推荐使用dip ,文字使用sp

 

 三、Android应用如何进行单元测试

摘要:将下列代码拷到要测试的项目<application>下:

 <uses-library android:name="android.test.runner" />

将下列代码拷到要测试的项目的<manifest>下:

 <instrumentation
        android:name="android.test.InstrumentationTestRunner"
        android:targetPackage="com.amos.androidjunit" />

 

1.创建一个普通android项目

创建一个名为androidjunit, android application project 项目

注:填好名称后一直next即可。

 

2.创建一个test项目,如下所示

 

 

 

3.配置androidjunit项目

将android test项目中的AndroidManifest.xml,如下所示,加粗的部分拷到要测试的项目的AndroidManifest.xml中位置类似

复制代码
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.amos.androidjunit.test"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="8" />

    <instrumentation
        android:name="android.test.InstrumentationTestRunner"
        android:targetPackage="com.amos.androidjunit" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <uses-library android:name="android.test.runner" />
    </application>

</manifest>
复制代码

将下列代码拷到对应的项目<application>下:

 <uses-library android:name="android.test.runner" />

将下列代码拷到对应的项目的<manifest>下:

 <instrumentation
        android:name="android.test.InstrumentationTestRunner"
        android:targetPackage="com.amos.androidjunit" />


4.写个测试例子,进行测试

com.amos.androidjunit.service.CalcService.java

复制代码
package com.amos.androidjunit.service;
public class CalcService {
    /*
     * 做相加的方法
     */
    public int add(int x, int y) {
        int result = x + y;
        return result;
    }
    /*
     * 做相减的方法
     */
    public int sub(int x, int y) {
        int result = x - y;
        return result;
    }
}
复制代码

com.amos.androidjunit.test.testcalc.java

复制代码
package com.amos.androidjunit.test;
import com.amos.androidjunit.service.CalcService;
import android.test.AndroidTestCase;
import android.util.Log;
public class testcalc extends AndroidTestCase{
    private static String tag = "testcalc";
    public void test_add() throws Exception{
        CalcService service = new CalcService();
        int result = service.add(3, 5);
        assertEquals(0, result);
    }
    public void test_sub() throws Exception{
        CalcService service = new CalcService();
        assertEquals(5, service.sub(10, 5));
    }
    @Override
    protected void setUp() throws Exception {
        //在测试前做一些初始化的操作
        Log.i(tag,"初始化已经开始。。");
    }
    @Override
    protected void tearDown() throws Exception {
        //在测试后做一些清理方面的操作
        Log.i(tag,"清理已经开始。。");
    }
}
复制代码

如下图所示进行测试:

 

注:1.选择要测试的方法,右键点击Run As”–“Android Junit Test” 

2.outline可以从window –>show view里找到,或者window–>reset perspective

 

 

四、android sdk源码下载

 以下地址有各个版本android sdk源代码,而且持续更新,相当不错,这里做个备份

http://repository.grepcode.com/java/ext/com/google/android/android/

 

 

注:本文页面布局中部分内容转自:http://blog.csdn.net/android_tutor/article/details/4779097

[转载]微信公众平台.net HttpClient 异步客户端 - 阿新 - 博客园

mikel阅读(881)

[转载]微信公众平台.net HttpClient 异步客户端 – 阿新 – 博客园.

微信公众平台.net HttpClient 异步客户端

该客户端实现了对微信公众平台的后台管理,包括获取Token,发生客服消息(文本,图片,语音,视频),自定义菜单的创建,查询,删除,查询订阅用户,创建分组管理功能,很可惜对媒体文件上传始终没有成功,希望这一块能得到大家的帮助,源代码在https://github.com/neozhu/WxClientSDK

以下代码结构

功能简单全部由静态方法实现,没有其他设计模式

 

希望有大侠能帮忙实现文件上传功能

[转载]Android的AsyncTask源码分析 - 周柯文 - 博客园

mikel阅读(1015)

[转载]AsyncTask源码分析 – 周柯文 – 博客园.

要研究Android的AsyncTask之前,要先搞明白FutureTask和Executor类:

FutureTask是什么:

FutureTask实际上是一个任务的操作类,它并不启动新线程,只是在自己所在线程上操作,任务的具体实现是构造FutureTask时提供的,实现自Callable<V>接口,FutureTask不知道具体的任务是什么,它只知道如何调度任务,如:

  • 如何启动任务:在FutureTask的run()方法中(实现自Runnable.run()),调用Callable.call()方法来启动任务,Callable.call()方法中是任务的具体实现;
  • 如何取消任务:在cancel()里,中断执行任务的线程,记录任务结束状态,并调用done()方法来执行用户实现的操作;
  • 如何返回任务的运行结果:如果任务还在执行,则阻塞线程(使用LockSupport.park()),直到任务结束才返回结果,用户可以通过get()方法来获取结果,同样当任务运行结束时,会调用down()来执行用户实现的操作。

使用FutureTask的好处是,更轻松的对任务进行管理,而不是像Runnable那样扔进线程后就啥也不能做了。

Executor是什么:

Executor顾名思义是任务执行者,它不关心是什么任务,只关心如何执行任务。Executor是个Interface,具体如何执行任务要看怎么实现这个接口,你可以这样实现:

 class DirectExecutor implements Executor {
  @Override
   public void execute(Runnable r) {
     r.run();
   }
 }

也可以这样实现:

class ThreadPerTaskExecutor implements Executor {
  @Override
   public void execute(Runnable r) {
     new Thread(r).start();
   }
 }

这两种实现的区别显而易见,java文档还提供了另一个Executor实现的例子:

class SerialExecutor implements Executor {
final Queue tasks = new ArrayDeque();
final Executor executor;
Runnable active;

SerialExecutor(Executor executor) {
this.executor = executor;
}

@Override
public synchronized void execute(final Runnable r) {
tasks.offer(new Runnable() {
public void run() {
try {
r.run();
} finally {
scheduleNext();
}
}
});
if (active == null) {
scheduleNext();
}
}

protected synchronized void scheduleNext() {
if ((active = tasks.poll()) != null) {
executor.execute(active);
}
}
}

这个实现的意思是,严格按照用户提交的顺序来执行任务。Android的AsyncTask就使用了这个例子。

AsyncTask是如何实现的:

AsyncTask实现的关键地方在构造函数和executeOnExecutor()函数里。

  • 首先看下构造函数:

public AsyncTask() {
        mWorker = new WorkerRunnable<Params, Result>() {
            public Result call() throws Exception {
                mTaskInvoked.set(true);
                Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
          //任务的具体实现
                return postResult(doInBackground(mParams));
            }
        };

        mFuture = new FutureTask<Result>(mWorker) {
            @Override
            protected void done() {
                try {
                    postResultIfNotInvoked(get());
                } catch (InterruptedException e) {
                    android.util.Log.w(LOG_TAG, e);
                } catch (ExecutionException e) {
                    throw new RuntimeException(
                            "An error occured while executing doInBackground()",
                            e.getCause());
                } catch (CancellationException e) {
                    postResultIfNotInvoked(null);
                }
            }
        };
    }

代码中WorkerRunnable实现自Callable,所以mWorker就是任务的具体实现(call()中的doInBackground())。通过对FutureTask的说明可以知道,mFuture是mWorker的操作类,它不仅用来实现对AsyncTask任务的操作(cancel,get等),最主要的,实现了mWorker执行结束的操作:

private void postResultIfNotInvoked(Result result) {
        final boolean wasTaskInvoked = mTaskInvoked.get();
        if (!wasTaskInvoked) {
            postResult(result);
        }
    }

    private Result postResult(Result result) {
        @SuppressWarnings("unchecked")
        Message message = sHandler.obtainMessage(MESSAGE_POST_RESULT,
                new AsyncTaskResult<Result>(this, result));
        message.sendToTarget();
        return result;
    }

    private static final InternalHandler sHandler = new InternalHandler();

    private static class InternalHandler extends Handler {
        @SuppressWarnings({ "unchecked", "RawUseOfParameterizedType" })
        @Override
        public void handleMessage(Message msg) {
            AsyncTaskResult result = (AsyncTaskResult) msg.obj;
            switch (msg.what) {
            case MESSAGE_POST_RESULT:
                // There is only one result
                result.mTask.finish(result.mData[0]);
                break;
            case MESSAGE_POST_PROGRESS:
                result.mTask.onProgressUpdate(result.mData);
                break;
            }
        }
    }

    private void finish(Result result) {
        if (isCancelled()) {
            onCancelled(result);
        } else {
            onPostExecute(result);
        }
        mStatus = Status.FINISHED;
    }

FutureTask和Handler共同实现了任务结束的操作,代码很简单,不赘述。

接下来是executeOnExecutor()函数的实现:

public final AsyncTask<Params, Progress, Result> execute(Params... params) {
        return executeOnExecutor(sDefaultExecutor, params);
    }

    public final AsyncTask<Params, Progress, Result> executeOnExecutor(
            Executor exec, Params... params) {
        if (mStatus != Status.PENDING) {
            switch (mStatus) {
            case RUNNING:
                throw new IllegalStateException("Cannot execute task:"
                        + " the task is already running.");
            case FINISHED:
                throw new IllegalStateException("Cannot execute task:"
                        + " the task has already been executed "
                        + "(a task can be executed only once)");
            }
        }

        mStatus = Status.RUNNING;

        onPreExecute();

        mWorker.mParams = params;
        exec.execute(mFuture);

        return this;
    }

AsyncTask是通过execute或executeOnExecutor启动的,通过上边对Executor的介绍可以知道,在executeOnExecutor()中的exec.execute(mFuture)这一行就是根据exec的实现方式来启动mFuture了,问题的关键是exec是如何实现execute()的。在execute中可以看到AsyncTask提供了一个默认的sDefaultExecutor,这个sDefaultExecutor是什么呢:

private static volatile Executor sDefaultExecutor = SERIAL_EXECUTOR;

    public static final Executor SERIAL_EXECUTOR = new SerialExecutor();

    private static class SerialExecutor implements Executor {
        final ArrayDeque<Runnable> mTasks = new ArrayDeque<Runnable>();
        Runnable mActive;

        public synchronized void execute(final Runnable r) {
            mTasks.offer(new Runnable() {
                public void run() {
                    try {
                        r.run();
                    } finally {
                        scheduleNext();
                    }
                }
            });
            if (mActive == null) {
                scheduleNext();
            }
        }

        protected synchronized void scheduleNext() {
            if ((mActive = mTasks.poll()) != null) {
                THREAD_POOL_EXECUTOR.execute(mActive);
            }
        }
    }

默认情况下,sDefaultExecutor就是SerialExecutor类,通过源码可以看到,SerialExecutor是一个严格按照用户提交顺序来执行任务的执行者,其中scheduleNext()函数用来启动下一个任务:

protected synchronized void scheduleNext() {
if ((mActive = mTasks.poll()) != null) {
THREAD_POOL_EXECUTOR.execute(mActive);
}
}

THREAD_POOL_EXECUTOR就是真正启动任务的Executor:

public static final Executor THREAD_POOL_EXECUTOR = new ThreadPoolExecutor(
CORE_POOL_SIZE, MAXIMUM_POOL_SIZE, KEEP_ALIVE, TimeUnit.SECONDS,
sPoolWorkQueue, sThreadFactory);

ThreadPoolExecutor是java自己实现的一种Executor,顾名思义,是个提供线程池的Executor。

由上可以知道,当调用AsyncTask的execute()函数时,AsyncTask会按用户提交任务的顺序,在线程池里串行的执行任务(当前任务运行结束,再运行下一个)。

当然用户也可以提供自己的Executor来改变AsyncTask的运行方式。

[转载]ASP.NET MVC 5 Lifecycle Document Published - .NET Web Development and Tools Blog - Site Home - MSDN Blogs

mikel阅读(1183)

转载ASP.NET MVC 5 Lifecycle Document Published – .NET Web Development and Tools Blog – Site Home – MSDN Blogs.

Fresh out of the oven is a PDF document that charts the lifecycle of every ASP.NET MVC 5 application. Many of you have requested this document over the years and we’re glad to finally put it in your hands now.

You will find the PDF document very similar to the ASP.NET application lifecycle topic in its approach. It’s a graphical representation of the ASP.NET MVC 5 lifecycle, but you will also see all the comprehensive details and explanations of the MVC pipeline that can help you make the correct decision on the what, when, and how of your ASP.NET MVC code development. Here’s a preview:

When you view the PDF document, you can also jump to useful links by clicking one of the clickable elements. There is much more useful content out there, and we can only include one link for each piece of detail, but it is one way for us to recognize a the priceless contributions the ASP.NET community has made to this cause over the years.

Please check it out, and send us your feedback! We (I) will definitely follow up and improve this document to make it valuable to you as we should.

-Cephas Lin

程序员创业的春天来临 - 翼发云计算 - 博客园

mikel阅读(951)

程序员创业的春天来临 – 翼发云计算 – 博客园.

      程序员创业,古今中外,都不是什么新鲜事儿。我们是那么一群聪明、优秀、善于学习还勤奋的一个群体,天生我才必有用,有什么做不到的呢?于是不少程序员创 办的公司成立了,可惜的是,程序员朋友们在创业的时候,往往没有做好充分准备,百分之九十的新创公司在两、三年内倒闭。

     失败率高我认为有三个主要原因:

  1、开公司有一定的资金门槛即注册资本,另外还需要有一部分资金用于公司的日常运作,程序员一般靠自己的积蓄和亲朋好友借来的钱来维持公司运转,自己还得生活,经济压力大,如果公司不能很快盈利,自然坚持不了多久。

  2、程序员当初用于研发的时间和精力,大部分被工商、税务等公司运营的琐碎事务给占用了,自然投入在产品研发上的时间和精力大幅减少,产出的软件产品的质量难免就有欠缺,在市场上的竞争力就大打折扣。

  3、不喜欢或不擅长销售,市场开拓遇到困难,产品难以销售出去,没有销售就没有收入,等积蓄或借来的钱耗完了,再有前途的产品也没办法,坚持不下去,公司只能关门。

    为什么说现在程序员创业的春天到来了呢?

     第一、公司注册资本登记制度改革,开公司门槛大幅降低

     改革包括五个方面的内容:一是放宽注册资本登记条件。二是将企业年检制度改为年度报告制度。三是放宽市场主体住所(经营场所)登记条件,由地方政府具体规定。四是大力推进企业诚信制度建设。五是推进注册资本由实缴登记制改为认缴登记制,降低开办公司成本。

      简单说,就是当初用于注册资本的钱可以省下来用于公司经营,跑工商税务的大部分时间精力可用来搞研发等,说得极端一点,就是只要程序员能吃苦,啃着方便面没收入也能让公司坚持个十年、八年的。

  第二、产品研发

      国家公司制度的改革,让程序员从琐碎的公司经营事务中解放出来,投入更多的时间和精力来开发产品。但这是不够的,必须懂项目管理,这样才能保证产品的质量 和按期投入市场。项目管理和软件开发一样,也是一门学问,这得花时间和精力学习,程序员创业本来就要人没人,要资金没资金(土豪程序员除外),怎么办?这 里建议采用敏捷项目管理方法,简单快捷,花每天一块钱(每天做公交车来回钱都不止这个价)注册一套在线敏捷项目管理软件来管理研发,省心又省力。比如国外 的“redmine”,国内的“翼发云项目管理”等都是很不错的选择。

   第三、市场销售

  公司运行顺畅而又能坚持了,产品开发也有眉目了,接下来当然就是最后一步,也是很多程序员讨厌的工作—市场和销售。不喜欢也得学着喜欢,可是市场和销售也是一门很深很广的学问,总不能再回到大学里学习这个专业四年吧。

      办法总是有的,荀子说:“假舆马者,非利足也,而致千里”!意思是,借助车马行走,并非脚走得快,而是善于借助外物,如今不错的销售管理软件总是融入了先 进的管理思想,那就引入一套销售管理系统来指导公司的销售管理工作,国外的Crm软件买不起,金蝶、用友的Crm也太贵,盗版的用的不放心。如今互联网这 么发达,就用在线的Crm好啦,价格实惠功能还不打折,国外的SalesForce,国内的翼发云Crm,都是不错的选择,费用几乎也就是每天座公交车的钱。

     最后,要有毅力能坚持

      这个世界只有偏执狂才能成功。马云曾说:“今天很残酷,明天更残酷,后天很美好,但是绝大部分人是死在明天晚上。”

      坚持就是胜利!预祝所有程序员们都能创业成功。

[转载]分析一个文本文件(英文文章)中各个词出现的频率,并且把频率最高的10个词打印出来。 - 赵天 - 博客园

mikel阅读(951)

[转载]分析一个文本文件(英文文章)中各个词出现的频率,并且把频率最高的10个词打印出来。 – 赵天 – 博客园.

设计分析:

遇到这样一个程序设计,首先解决的是文件读入的问题(我选择读入txt),用C中的文件指针很容易解决;

第二,英文文章中由英文字母,标点符号,其他字符组成,要将他们分离,这就用到了词法分析,将每个单词分离出来并且分析;

第三,统计单词个数(不一样的单词各有几个),排序,输出频率最高的10个。

要解决的是文件读取后储存问题,就是放在结构体中,单词的种类和数量统计起来。可以用结构体数组,可以用链表。

统计后排序的问题,如果将整个结构体或链表排序,那将是一件好大的工程,但是题目只是将频率最高的10个词打印出来,就像每天人们听歌,排行榜上的 第一页是用户听得最多的歌曲。于是,我只是初始化了一个结构体数组,长度为10,将10个排序,然后用最后一个,也就是这10个中频率最小的与其他的比 较,如果有频率比他高的,则插入到这个长度为10 的结构体数组中。插入之后还是顺序的。这样就节省了很多的工作量。

数据结构:

储存单词的数据结构:

①结构体

typedef struct
{
char danci[19];//储存单词
int count;//记录单词个数,后面出现几次
}sq;

②链表

struct Word

{
char danci[19];
int count;
struct Word *next;
};

找出频率最高的十个单词

for(i=10;i<n;i++)
{
if(frequency_max[9].count<word[i].count)
{
int a=8;
while(frequency_max[a].count<word[i].count&&a>=0)
{
a–;
}

for(j=9;j>a+1;j–)
{
frequency_max[j]=frequency_max[j-1];
}
if(a<0)
frequency_max[0]=word[i];
else
frequency_max[j]=word[i];
}
}

 

代码:

#include<iostream>
#include<iomanip>
#include<time.h>
using namespace std;
#define M 20000
 //文章单词个数

typedef struct 
{
    char danci[19];//储存单词
    int count;//记录单词个数,后面出现几次
}sq;

void main()
{    
    double start,finish;
    start=(double)clock();
    sq word[M];
    sq t_word;
    double s,f;
    int K,n=0,i,j;
    char infile[10];
    s=(double)clock();
    cout<<"***********请输入文件路径:***********"<<endl;
    cin>>infile;//文件路径输入    
    f=(double)clock();//
    cout<<"输入文件路径的时间:"<<(f-s)/1000<<"s"<<endl;

    FILE *fp;
    char ch;
    //fp=fopen("d://pro.txt","r");
    if((fp=fopen(infile,"r"))==NULL)
    {
        cout<<"无法打开文件!"<<endl;
        exit(0);
    }
    s=(double)clock();
    while(!feof(fp))
    {
        ch=getc(fp);
        if(ch==' '||ch==10)
        {//虑空
            continue;
        }
        if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))              //发现一个单词
        {
            K=0;
            t_word.count=1;
            while((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')||(ch=='\''))
            {
                if(ch>='A'&&ch<='Z')
                    ch+=32;//转换成小写
                t_word.danci[K++]=ch;
                ch=getc(fp);
            }
            t_word.danci[K++]='\0';
                  
            //一个单词结束
            j=n;
            
            for(i=0;i<j;i++) //与前面的单词比较
            {
                if(strcmp(t_word.danci,word[i].danci)==0)
                {    
                    word[i].count++;
                    break;    
                }
            
            }

            if(n==0||i==j)
            {
                word[n]=t_word;
                n++;
            }
            
        }
    }
    f=(double)clock();
    cout<<"读文件,分出单词并统计的时间:"<<(f-s)/1000<<"s"<<endl;

    s=(double)clock();
    //输出频率最高的十个单词
    sq frequency_max[10];
    sq temp;
    for(i=0;i<10;i++)
    {
        frequency_max[i]=word[i];//初始化频率最高的十个单词为前十个单词
    }
//前十个排序
    
    for(j=0;j<10;j++)
        for (i=0;i<10-j;i++)
            if(frequency_max[i].count<frequency_max[i+1].count)
            {
                temp=frequency_max[i];
                frequency_max[i]=frequency_max[i+1];
                frequency_max[i+1]=temp;
            }
    for(i=10;i<n;i++)
    {
        if(frequency_max[9].count<word[i].count)
        {
            int a=8;
            while(frequency_max[a].count<word[i].count&&a>=0)
            {
                a--;
            }
            
            for(j=9;j>a+1;j--)
            {
                frequency_max[j]=frequency_max[j-1];
            }
            if(a<0)
                    frequency_max[0]=word[i];
            else
                frequency_max[j]=word[i];
        }
    }
    f=(double)clock();
    cout<<"冒泡排序,搜索频率最高的10个单词的时间:"<<(f-s)<<"ms"<<endl;
    for(i=0;i<10;i++)
    {
        cout<<setiosflags(ios::left)<<setw(10)<<frequency_max[i].danci<<frequency_max[i].count<<endl;
    }
    finish=(double)clock();
    cout<<"总运行时间:"<<(finish-start)/1000<<"s"<<endl;
}

[转载]Android版AR 现实增强 高通 Vuforia QCAR SDK学习笔记(二)-Android开发进阶&经验分享-eoe Android开发者社区_Android开发论坛 - Powered by Discuz!

mikel阅读(803)

[转载]【Android版】AR 现实增强 高通 Vuforia QCAR SDK学习笔记(二)-Android开发进阶&经验分享-eoe Android开发者社区_Android开发论坛 – Powered by Discuz!.
Android版】AR 现实增强 高通 Vuforia QCAR SDK学习笔记(一)
http://www.arjishu.com/forum.php?mod=viewthread&tid=100&extra=page%3D1

引言:经过入门教程,大家对高通SDK有个初步的了解了,下面我们来学习如何更换识别目标图像。

1.在高通官网注册一个帐号。
注册地址:https://developer.vuforia.com/user/register
注册没有什么可说的,注意:密码必须包含大小写字母、数字。

2.然后登录,然后点顶部的Target Manager(目标管理)
a)首先点create database 创建一个数据库,取个你容易记的名称嘛
b)然后进入创建的database,点addtarget,按照提示来添加目标识别图像,然后就等待服务器处理图像完成。
PS:这里的图像的星级提升可以参照这篇文章:
https://developer.vuforia.com/resources/dev-guide/image-target-enhancement-tricks
麻烦英语好的人,把这篇文章的意思提供出来,感激不尽,我就大概知道决定星级的因素有:图片复杂程度、明暗对比度
c)等服务器处理完成图像后,一定要等图片上不是Processing,才能做下面的操作,不然不会识别成功。勾选刚刚上传的图像,点”Download selected Targets”按钮,然后选择SDK,随便输入一个Database Name,我这里输入为test,最后点create按钮,就会出现下载提示,下载下来就可以了,后面需要用到。

3.使用下载下来的数据文件.(目前使用的是最简单的目标图片替换方式。等大家熟悉代码后,可以随意替换)
a)将test.zip。解压,会有两个文件test.xml、test.dat。将这两个文件放到项目assets目录下
b)打开jni下的imageTarget.cpp文件,找到216行 将Tarmac.xml改为test.xml,然后保存

4.然后按照教程一中的编译方式重新编译jni目录,接着运行项目,点菜单,选择switch to Tarmac 。

5.将摄像头对着你的图像,到此,你就可以识别自己想要识别的图像了。

good luck

对AR感兴趣的童鞋可以加入我们AR大家庭
AR技术网: http://www.arjishu.com/
QQ群名 :AR技术网—ar研究群

群     号 :38122344

[转载]Android版AR 现实增强 高通 Vuforia QCAR SDK学习笔记(一)-Android开发进阶&经验分享-eoe Android开发者社区_Android开发论坛 - Powered by Discuz!

mikel阅读(757)

转载【Android版】AR 现实增强 高通 Vuforia QCAR SDK学习笔记(一)-Android开发进阶&经验分享-eoe Android开发者社区_Android开发论坛 – Powered by Discuz!.

望集齐大家的力量,将AR(增强现实)发展壮大。

PS:不是我不加链接,是我加了超链接,没有用啊,难道是我权限不够,只得自己复制、粘贴了

1.下载高通SDK(高通刚刚才更新开发中心地址,版本更新为V2.0)
https://developer.vuforia.com/resources/sdk/Android
下载对应系统的安装程序,下载完成后,你就下一步下一步安装吧。

2.编译QCAR需要NDK环境,下载NDK,此处我用的是r8c版本
http://dl.google.com/Android/ndk/android-ndk-r8c-windows.zip
一路下一步安装完成。

3.下载高通SDK,sample示例代码(原来示例和SDK是一起的,不知为何现在要分开了)
https://developer.vuforia.com/resources/sample-apps/android/vuforia-sampleapps-android-2-0-6.zip/null/accepted (不要把/null/accepted去了,不然,你可以下载不了)
PS:下载后,你可以不是一个.zip格式的文件,不过你一样可以用压缩软件打开。然后把里面的示例解压出来就是

4.把你下好的示例,解压到安装成功的SDK目录下的“samples”目录下
(最好是这个目录下,不然你编译的时候还有修改配置文件,那就麻烦了,你最好把下的示例备份一下,以免你把代码弄乱了,又得重下)
我是安装在D盘的,路径是:D:\Development\Android\vuforia-sdk-android-2-0-30\samples

5.导入示例。下面我们就以最简单的示例开始,ImageTargets-2-0-6,导入这个项目到eclipse中。

6.编译JNI目录。用一种最简单的方法编译(以后在介绍如何配置到eclipse里面进行编译)
运行cmd.exe.按照以下步骤来
a) D:
b) cd D:\Development\Android\vuforia-sdk-android-2-0-30\samples\ImageTargets-2-0-6\jni (这一步,你安装到那个目录,就进入哪个目录)
c) F:\Android\android-ndk-r8b\ndk-build.cmd(这一步,也是,你NDK安装在那个目录,就写哪个目录,你最好复制一下这个路径,以后用的比较多)
正常情况,你是会看到以下结果的
“Compile++ arm  : ImageTargets <= ImageTargets.cpp
“Compile++ arm  : ImageTargets <= SampleUtils.cpp
“Compile++ arm  : ImageTargets <= Texture.cpp
StaticLibrary  : libstdc++.a
Prebuilt       : libQCAR.so <= jni/../../../build/lib/armeabi/
SharedLibrary  : libImageTargets.so
Install        : libImageTargets.so => libs/armeabi/libImageTargets.so
Install        : libQCAR.so => libs/armeabi/libQCAR.so
“Compile++ arm  : ImageTargets <= ImageTargets.cpp
“Compile++ arm  : ImageTargets <= SampleUtils.cpp
“Compile++ arm  : ImageTargets <= Texture.cpp
StaticLibrary  : libstdc++.a
Prebuilt       : libQCAR.so <= jni/../../../build/lib/armeabi-v7a/
SharedLibrary  : libImageTargets.so
Install        : libImageTargets.so => libs/armeabi-v7a/libImageTargets.so
Install        : libQCAR.so => libs/armeabi-v7a/libQCAR.so

7.那么到这一步,就恭喜你,编译成功了,到eclipse去,刷新一下项目会多出lib和obj两个目录

8.导入QCAR.jar到项目libs,右键这个jar包,在Build Path中选择Add to Build Path
QCAR.jar 在这个目录下:D:\Development\Android\vuforia-sdk-android-2-0-30\build\java\QCAR

最后你就可以运行这个示例,点开项目media目录下的chips.jpg图片,用摄像头对着这张图片,会出现一个3D的茶壶
效果如下:

编译好的源码如下:(CSDN免积分下载,22.21M,有点大)
http://download.csdn.net/download/cellpacing/4925271

其它示例,你都可以照着5-8步运行出来,good luck

【Android版】AR 现实增强 高通 Vuforia QCAR SDK学习笔记(二)
http://www.eoeandroid.com/thread-249118-1-1.html

对AR感兴趣的童鞋可以加入我们AR大家庭
AR技术网: http://www.arjishu.com/
QQ群名 :AR技术网—ar研究群

群     号 :38122344