当前位置:  编程技术>移动开发
本页文章导读:
    ▪ubuntu10.04下移植miniGUI 1.3.3        ubuntu10.04上移植miniGUI 1.3.3 首先,你需要下载的MiniGUI 的包: http://www.minigui.com/download/libminigui-1.3.3.tar.gz     http://www.minigui.com/download/minigui-res-1.3.3.tar.gz  这两个包的下载需要你在www.minigui.co.........
    ▪ Mms短信群发兑现原理        Mms短信群发实现原理Mms短信群发实现原理 1、引入       大家也许对单条短信的发送已经非常清楚明白,但对短信的群发可能是一知半解,那短信的群发是怎么样实现的了? 本章重点解析Mm.........
    ▪ 筹建LibGDX引擎开发环境       搭建LibGDX引擎开发环境从http://libgdx.badlogicgames.com/nightlies/dist/gdx-setup-ui.jar下载gdx-setup-ui.jar 下载完成后直接双击此文件或在命令行里执行 java -jar gdx-setup-ui.jar 即可打开LibGDX创建工程的窗口,.........

[1]ubuntu10.04下移植miniGUI 1.3.3
    来源: 互联网  发布时间: 2014-02-18
ubuntu10.04上移植miniGUI 1.3.3

首先,你需要下载的MiniGUI 的包:


http://www.minigui.com/download/libminigui-1.3.3.tar.gz    
http://www.minigui.com/download/minigui-res-1.3.3.tar.gz 
这两个包的下载需要你在www.minigui.com  上注册过才可以下载,免费注册的,自己去下吧
http://www.minigui.com/downloads/minigui13/mde-1.3.0.tar.gz图形界面程序
http://www.minigui.com/downloads/minigui13/mg-samples-1.3.0.tar.gz 一些小例子

 

在/home/下创建新的工作目录

[user]# mkdir -p /home/minigui

把 libminigui-1.3.3.tar.gz 解开
[user]# tar  zxf  libminigui-1.3.3.tar.gz
[user]# tar zxf minigui-res-1.3.3.tar.gz

编译 libminigui  ,这个是 minigui 运行所必需的库文件,必须编译成功
[user]# cd libminigui-1.3.3
[user]# ./configure                 //最简单的编译方式,让它自己去配置 ,这里采用缺省的Thread 模式而不是Lite模式,因为这种方式在 PC 机上使用最方便,后面移到板子上再改成 Lite 模式即可

注意屏幕上的输出,特别是下面几条

checking for FrameBuffer console support... yes
checking for pthread library... yes
checking for TT_FreeType_Version in -lttf... yes
checking for T1_InitLib in -lt1... no
checking for jpeg_std_error in -ljpeg... yes
checking for png_check_sig in -lpng... yes

其中 –lttf   –lpng 必须是 yes,不然后面你的程序肯定会有问题,如果这里不是 yes的话,那么就可能是相应的库没有安装。

注:如果库已经正确安装,依然显示为no,例如有checking for png_check_sig in -lpng... no

解决办法:通过vi进入configure文件,查找png,在如下所注黑体处修改

if test "x$build_png_support" != "xno"; then

    echo "$as_me:$LINENO: checking for png_check_sig in -lpng" >&5

echo $ECHO_N "checking for png_check_sig in -lpng... $ECHO_C" >&6

if test "${ac_cv_lib_png_png_check_sig+set}" = set; then

  echo $ECHO_N "(cached) $ECHO_C" >&6

else

  ac_check_lib_save_LIBS=$LIBS

#I modified the below line

#LIBS="-lpng -lm  $LIBS"

LIBS="-lpng -lm -lz $LIBS"

其中 ttf 库是对 TrueType字体的支持,png库是对 png图形的支持,jpeg库是对jpeng图形的支持,MiniGui里都需要这两个,在后面为板子交叉编译的时候也需要这两个,不然你的程序跑不起来。

 

如果./configure 结果中显示yes通过了,下面是编译了,执行如下命令。

# make

# make install

 

如果./configure 结果中显示的是no,则需要手动添加这些库了:

 

安装zlib库

zlib 库是后面的库的编译基础。首先需要安装这个库。

安装包:zlib-1.2.3.tar.gz

# tar  zxf  zlib-1.2.3.tar.gz

# cd zlib-1.2.3
# ./configure

# make

# make install

 

安装freetype库

解压步骤一致。

在make的时候可能出现以下错误:

1、错误一:

        X11/Xlib.h:No such file or directory

     解决方法:

         sudo apt-get install libx11-dev

 

2、错误二:

ftdump.c:172:1: pasting "." and "glyph_object" does not give a valid preprocessing token
ftdump.c:182:1: pasting "." and "first_instance" does not give a valid preprocessing token
ftdump.c:191:1: pasting "." and "second_instance" does not give a valid preprocessing token
ftdump.c:201:1: pasting "." and "face_object" does not give a valid preprocessing token
ftdump.c:202:1: pasting "." and "glyph_object" does not give a valid preprocessing token
ftdump.c:203:1: pasting "." and "second_instance" does not give a valid preprocessing token
ftdump.c:863:1: pasting "." and "initial_overhead" does not give a valid preprocessing token
ftdump.c:882:1: pasting "." and "face_object" does not give a valid preprocessing token
make[1]: *** [ftdump.o] Error 1
make[1]: Leaving directory `/software/freetype-1.3.1/test'
make: *** [tttest] Error 2

 

解决方法:

       修改Makefile:
1. 去掉all: ttlib tttest ttpo中的tttest
2. 删除
install:
        cd $(FTLIBDIR); $(MAKE) -f $(MAKEFILE) install
        cd $(FTTESTDIR); $(MAKE) -f $(MAKEFILE) install
        cd $(FTPODIR); $(MAKE) uninstall
中的 cd $(FTTESTDIR); $(MAKE) -f $(MAKEFILE) install

 

安装png库

安装包:libpng-1.0.10rc1.tar.gz

Libpng 不提供有效的 configure 脚本,所以只好自己动手改 Makefile 文件了

# cp scripts/makefile.linux  Makefile   //把 Scripts  下的一个 makefile 拷出来自己动手改,在ubuntu中一般不需要修改

# make

# make install

 

安装jpeg库

安装包:jpegsrc.v6b.tar.gz

# cd  jpeg-6b  

# ./configure –perfix=/usr/local –enable-shared

# make

# make install

 

重新安装libminigui

 在安装完成了所有的支持库以后,重新进入libminigui文件夹,运行configure命令后,应该所安装的支持库都显示yes

#./configure

checking for FrameBuffer console support... yes
checking for pthread library... yes
checking for TT_FreeType_Version in -lttf... yes
checking for T1_InitLib in -lt1... no
checking for jpeg_std_error in -ljpeg... yes
checking for png_check_sig in -lpng... yes

 

#make

在编译的过程中还可能出现以下的错误

……
freetype.c:47:41: freetype1/freetype/freetype.h: No such file or directory
freetype.c:48:40: freetype1/freetype/ftxkern.h: No such file or directory
freetype.c:49:41: freetype1/freetype/ftnameid.h: No such file or directory
freetype.c:50:40: freetype1/freetype/ftxcmap.h: No such file or directory
freetype.c:51:41: freetype1/freetype/ftxwidth.h: No such file or directory
……
make[3]: *** [freetype.lo] Error 1
make[3]: Leaving directory `/root/Minigui/libminigui-1.3.3/src/font'
make[2]: *** [install-recursive] Error 1
make[2]: Leaving directory `/root/Minigui/libminigui-1.3.3/src/font'
make[1]: *** [install-recursive] Error 1
make[1]: Leaving directory `/root/Minigui/libminigui-1.3.3/src'
make: *** [install-recursive] Error 1

 

解决方法:

freetype是用来支持字体显示的,如TrueType。是版本不一样。 这个错误的意思是说找不到库文件。 
大漠孤狼的文章里提到了一个freetype软件,先安装,我是安装到/usr/local/include里了。找到它们,做成“freetype1/freetype/freetype.h”的样子,再拷贝到/usr/include里面,执行make clean之后再make就行了。

 

具体方法:

# cd  /home/minigui/freetype-1.3.1

# mkdir -p /opt/cross/libttf/extend // 自己另外建立一个目录

# cp ./lib/* ./lib/arch/ansi/* /opt/cross/libttf/    //把有用的东西拷出来

# cp ./lib/extend/*  /opt/cross/libttf/extend/       //把 extend 目录下的文件也拷出来

 

注意 cp 命令不要用 –r 选项,因为会把一些没用的东西出拷出来的

拷贝完成了,现在来自己手动编译了

 

# cd /opt/cross/libttf      //就是上面新建的一个目录

# gcc -c -fPIC -O2 freetype.c //只要编译这一个 .c 文件,因为它包括了其它所有的 .c 文件了,你可以自己查看它的内容

# gcc -c -fPIC -O2  -I./  extend/*.c   //把 extend 下所有的 .c 文件全部编译,注意-I./ 中是大写的i

# gcc --shared -o libttf.so  *.o  //生成最后的动态链接库,OK了

 

# mkdir -p /usr/include/freetype1/freetype

 

# cp *.h  extend/*.h  /usr/include/freetype1/freetype

# cp libttf.so  /usr/local/lib 

 

解决了这个问题之后,应该可以正确编译了。接着安装编译结果

# make install

 

安装minigui资源

安装包:minigui-res-1.3.3.tar.gz

# cd  /home/minigui/minigui-res-1.3.3

# make install

 

相关的配置设置

首先,修改你的 /etc/ld.so.conf 文件,在里面最后新加入一行 /usr/local/lib

然后执行

#  ldconfig

# vi /usr/local/etc/MiniGUI.cfg

 

在里面找到

 

[system]

# GAL engine

#gal_engine=fbcon

gal_engine=qvfb   //这里修改

 

# IAL engine

#ial_engine=console

ial_engine=qvfb    //这里修改

 

mdev=/dev/mouse

mtype=IMPS2

 

[fbcon]

defaultmode=1024x768-16bpp

 

[qvfb]

defaultmode=640x480-16bpp    //这里修改

display=0

 

qvfb的安装

如果系统里还没有安装话qvfb,那么需要安装一个 qvfb ,

 

# cd  /home/minigui1.3.3-arm/qvfb-1.0

# ./configure

# make

# make install

 

注:有可能编译时候,有错误cheching for Qt...configure:error: Qt(>= Qt 3.0.3)(headers and libraries)not found.please check your installation!

解决办法:安装 libqt3-mt-dev 包,执行命令apt-get install libqt3-mt-dev ,或者找到相应包进行受到安装。(再不行分别装上libqt3-headers libqt3-mt libqt3-mt-dev包试一下),另外在执行./configure 可以同时加上参数 LDFLAGS和CPPFLAGS指定库文件和头文件所在的目录。至于 ./configure的用法可以在./configure --help查询

 

--with-qt-dir=/usr/lib/qt-3.3

or

--with-qt-includes=/usr/lib/qt-3.3/include
--with-qt-libraries=/usr/lib/qt-3.3/lib

 

试验的测试

 mg-samples-1.3.0.tar.gz 这个包就是一些例子,现在试试:

# tar zxf mg-samples-1.3.0.tar.gz

# ./configure

# make

# cd src

 

看看 src 目录下是不是已经编译出可执行文件来了

Cd sr     

执行例子程序:

[user]# qvfb &           //在图形界面下执行

在 qvfb 中选 File  Configure  640x480 VGA   16bit   ,这样看起来舒服

[user]#  cd  /home/minigui1.3.3-arm/mg-samples-1.3.0/src

[user]# ./helloword

效果如下图所示:

OK ,这个时候你应该可以看到在 qvfb 中的执行效果了吧,记住:一定要先运行 qvfb ,并且设置 qvfb ,然后再运行你的程序,而且qvfb 每重启一次就需要重新设置一下


 

 

 


 

 


 



    
[2] Mms短信群发兑现原理
    来源: 互联网  发布时间: 2014-02-18
Mms短信群发实现原理
Mms短信群发实现原理

1、引入
      大家也许对单条短信的发送已经非常清楚明白,但对短信的群发可能是一知半解,那短信的群发是怎么样实现的了?
本章重点解析Mms短息群发功能的实现。这里要注意了如果大家对于短信发送的流程不清楚的同学可以看看我前面讲到
的短信发送和接收流程。
2、概括
2.1、类图

2.2、时序图


 由于此时序图太大有一些不清晰还请见谅;
3、具体解析

时序图有太大所以不是很清晰;这里对时序图进行解析,主力有一大部分是短信的发送流程,所以在此重点讲解群发与单条短信的区别之处;

1)短信进入数据库待发送表中
    首先在这里唠叨一下在mmsms.db数据库中的sms表,该表保存了短信的相关内容,如下图所示:
        
该表示保存了短信的相关内容,这里的截图没有截完整,大家可以下来后自己查看该表的想请,这里要说的是type字段;、
该字段非常重要,先来看看type的分类:
 public static final int MESSAGE_TYPE_ALL    = 0;
        public static final int MESSAGE_TYPE_INBOX  = 1;
        public static final int MESSAGE_TYPE_SENT   = 2;
        public static final int MESSAGE_TYPE_DRAFT  = 3;
        public static final int MESSAGE_TYPE_OUTBOX = 4;
        public static final int MESSAGE_TYPE_FAILED = 5; // for failed outgoing messages
        public static final int MESSAGE_TYPE_QUEUED = 6; // for messages to send later
        public static final int MESSAGE_TYPE_INBOX_SUB1 = 7;
        public static final int MESSAGE_TYPE_INBOX_SUB2 = 8;
看到这你有莫有感悟了,大家请看时序图的第三步,讲需要发送的短信保存到quen队列中去,下面请看如下代码:
    private boolean queueMessage(long token) throws MmsException {
        if ((mMessageText == null) || (mNumberOfDests == 0)) {
            // Don't try to send an empty message.
            throw new MmsException("Null message body or dest.");
        }

        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(mContext);
        boolean requestDeliveryReport = prefs.getBoolean(
                MessagingPreferenceActivity.SMS_DELIVERY_REPORT_MODE,
                DEFAULT_DELIVERY_REPORT_MODE);

        for (int i = 0; i < mNumberOfDests; i++) {
            try {
                log("updating Database with sub = " + mSubscription);
                Sms.addMessageToUri(mContext.getContentResolver(),
                        Uri.parse("content://sms/queued"), mDests[i],
                        mMessageText, null, mTimestamp,
                        true /* read */,
                        requestDeliveryReport,
                        mThreadId, mSubscription);
            } catch (SQLiteException e) {
                SqliteWrapper.checkSQLiteException(mContext, e);
            }
        }
        // Notify the SmsReceiverService to send the message out
        Intent intent = new Intent(SmsReceiverService.ACTION_SEND_MESSAGE, null, mContext, SmsReceiver.class);
		intent.putExtra(SUBSCRIPTION, mSubscription);
        mContext.sendBroadcast(intent);
		
        return false;
    }
    在for循环里面,将对应短信的内容加入到content://sms/queued中去,大家可能看到这糊涂了,为了不让大家都糊涂下面简单介绍SmsProvider的insert()方法,
insert方法在插入数据库前会去解析content://sms/queued这个uri,解析后会根据这个uri的类型进行设置type字段的值,然后将数据插入数据库。如果像上面的queued类型其type字段的值就是6。
注意:该字段的值很重要,后面会多次修该值

2)取出第一条短信进行发送
       时序图4-8步,可以看出这里没有做实质的内容,只是将发送的任务传递给SmsReceiverService,该service很重要,当你看到这时你不会觉得它的重要性,当你看完整个流程的时候你就知道它的重要性。它的会进行异步处理,将工作转交给ServiceHandler。
     9-12步这里开始发送,9、10步太简单没有太多分析的必要,请看11步调用sendFirstQueuedMessage()方法,该方法查询数据库取出第一条数据,其核心代码如下:
String where = Sms.SUB_ID + "=" + subscription;
        Cursor c = SqliteWrapper.query(this, resolver, uri,
                        SEND_PROJECTION, where, null, "date ASC");  // date ASC so we send out in
                                                                    // same order the user tried
                                                                    // to send messages.
        if (c != null) {
            try {
                if (c.moveToFirst()) {
                    String msgText = c.getString(SEND_COLUMN_BODY);
                    String address = c.getString(SEND_COLUMN_ADDRESS);
                    int threadId = c.getInt(SEND_COLUMN_THREAD_ID);
                    int status = c.getInt(SEND_COLUMN_STATUS);

                    int msgId = c.getInt(SEND_COLUMN_ID);
                    Uri msgUri = ContentUris.withAppendedId(Sms.CONTENT_URI, msgId);
这段代码没有太多复杂的逻辑可以看出取出第一条中的各个数据 ;
然后调用SmsSingleRecipentSender的sendMessage方法发送
  sender = new SmsSingleRecipientSender(this,
                            address, msgText, threadId, status == Sms.STATUS_PENDING,
                            msgUri, subscription);
                        sender.sendMessage(SendingProgressTokenManager.NO_TOKEN);;
关于
public boolean sendMessage(long token) throws MmsException {
          SmsManager smsManager = SmsManager.getDefault();
        ArrayList<String> messages = null;
        if ((MmsConfig.getEmailGateway() != null) &&
                (Mms.isEmailAddress(mDest) || MessageUtils.isAlias(mDest))) {
            String msgText;
            msgText = mDest + " " + mMessageText;
            mDest = MmsConfig.getEmailGateway();
            messages = smsManager.divideMessage(msgText);
        } else {
           messages = smsManager.divideMessage(mMessageText);
           // remove spaces from destination number (e.g. "801 555 1212" -> "8015551212")
           mDest = mDest.replaceAll(" ", "");
        }
        int messageCount = messages.size();
        if (messageCount == 0) {
            // Don't try to send an empty message.
            throw new MmsException("SmsMessageSender.sendMessage: divideMessage returned " +
                    "empty messages. Original message is \"" + mMessageText + "\"");
        }
        boolean moved = Sms.moveMessageToFolder(mContext, mUri, Sms.MESSAGE_TYPE_OUTBOX, 0);
        if (!moved) {
            throw new MmsException("SmsMessageSender.sendMessage: couldn't move message " +
                    "to outbox: " + mUri);
        }
        ArrayList<PendingIntent> deliveryIntents =  new ArrayList<PendingIntent>(messageCount);
        ArrayList<PendingIntent> sentIntents = new ArrayList<PendingIntent>(messageCount);
        for (int i = 0; i < messageCount; i++) {
            if (mRequestDeliveryReport) {
                // TODO: Fix: It should not be necessary to
                // specify the class in this intent.  Doing that
                // unnecessarily limits customizability.
                deliveryIntents.add(PendingIntent.getBroadcast(
                        mContext, 0,
                        new Intent(
                                MessageStatusReceiver.MESSAGE_STATUS_RECEIVED_ACTION,
                                mUri,
                                mContext,
                                MessageStatusReceiver.class),
                        0));
            }
            Intent intent  = new Intent(SmsReceiverService.MESSAGE_SENT_ACTION,
                    mUri,
                    mContext,
                    SmsReceiver.class);

            int requestCode = 0;
            if (i == messageCount -1) {
                // Changing the requestCode so that a different pending intent
                // is created for the last fragment with
                // EXTRA_MESSAGE_SENT_SEND_NEXT set to true.
                requestCode = 1;
                intent.putExtra(SmsReceiverService.EXTRA_MESSAGE_SENT_SEND_NEXT, true);
                intent.putExtra(SUBSCRIPTION, mSubscription);
            }
            sentIntents.add(PendingIntent.getBroadcast(mContext, requestCode, intent, 0));
        }
           smsManager.sendMultipartTextMessage(mDest, mServiceCenter, messages, sentIntents,
                       deliveryIntents, mSubscription);
        return false;
    }
该方法会做4件事情:
1、长短信的拆分;
2、添加sentintent和delieveryIntent;
     说明sentIntent是指本条短信发送完后将会执行的一个intent,这里这样解释有的同学可能会不太明白,简单的说  就是发送完一条短信后会回调的一个intent
      delieveryIntent :传输报告的intent
3、将本条短信保存到发件箱;
     这里一定要看清楚了这里其实是对sms表type字段的更新,会将6改成4,4表示发件箱,正在发送的短信,6表示的是待发送的短信
4、调用中间层SmsManager api的sendMultipartTextMessage方法将短信发送出去
      这里通过framework的一系列处理后交由rild,rild解析后通过at指令将短信发送出去,这里就没有太多必要分析


3)发送完一条后继续发送未发送的短信
       当发送完一条短信后怎么继续发送了,大家肯定疑惑了,可以发现前面只是发送待发送列表中的第一条短信,其他的短信怎么发送出去?
      在分析之前,要不厌其烦的说一下,当我们请求rild发送一条短信,那rild会给我们反馈,这在前面讲解单条短信发送的时候有提及到,反馈的事件就是RIL_REQUEST_SEND_SMS,然后会回调到SmsDispatcher类的handmessage方法,至于这个handler的介绍关于短信发送的中间层已经详细描述了,不知道的同学可以回顾一下。

      SmsDipatcher的handmessage方法里对发送完信息有一个专门的处理,handleSendComplete方法,这里会提到前面说的sentintent,这里sentIntent会发送com.android.mms.transaction.MESSAGE_SENT的广播到应用层去,记住这里有一个SEND_NEXT_MSG_EXTRA的变量值,该值应用层会使用它来判断是否发送下一条短信;
 Intent sendNext = new Intent();
 sendNext.putExtra(SEND_NEXT_MSG_EXTRA, true);
 sentIntent.send(mContext, Activity.RESULT_OK, sendNext);
可以看在应用层声明sentintent:
       Intent intent  = new Intent(SmsReceiverService.MESSAGE_SENT_ACTION,
                    mUri,
                    mContext,
                    SmsReceiver.class);

            int requestCode = 0;
            if (i == messageCount -1) {
                // Changing the requestCode so that a different pending intent
                // is created for the last fragment with
                // EXTRA_MESSAGE_SENT_SEND_NEXT set to true.
                requestCode = 1;
                intent.putExtra(SmsReceiverService.EXTRA_MESSAGE_SENT_SEND_NEXT, true);
                intent.putExtra(SUBSCRIPTION, mSubscription);
            }
            sentIntents.add(PendingIntent.getBroadcast(mContext, requestCode, intent, 0))
这样的话,在Mms中有注册com.android.mms.transaction.MESSAGE_SENT这个广播的接收器就有且仅有SmsReceiver
它接收不做任何处理然后转手扔给SmsReceiverService,“这个是给你的我是打酱油的“;SmsReceiverService该类我想大家应该不陌生了,前面有提到说它的重要性,不管是发送还是接收都逃不了它的控制,它起到了一个承前继后的作用。它是一个服务,服务启动后会发送message给ServiceHandler进行异步处理,handler会根据intent的action进行sent处理,这里会调用handleSmsSent方法;以下是核心的实现:
     boolean sendNextMsg = intent.getBooleanExtra(EXTRA_MESSAGE_SENT_SEND_NEXT, false);

        if (mResultCode == Activity.RESULT_OK) {
            if (!Sms.moveMessageToFolder(this, uri, Sms.MESSAGE_TYPE_SENT, error)) {
                Log.e(TAG, "handleSmsSent: failed to move message " + uri + " to sent folder");
            }
            if (sendNextMsg) {
                if (TelephonyManager.isMultiSimEnabled()) {
                    sendFirstQueuedMessage(intent.getIntExtra(SUBSCRIPTION , 0));
                } else {
                    sendFirstQueuedMessage();
                }
            }
我想看到这,你肯定会恍然大悟吧,首先会获取sendNextMsg前面有提到该值,这里会去根据该值来发送下一条信息,调用的方法仍然是前面提到的sendFirstQueuedMessage方法,该方法会去获取当前数据库中是否有需要发送的短信,如果有继续发送第一条,如果没有直接返回。注意这里有一个Sms.moveMessageToFolder(this, uri, Sms.MESSAGE_TYPE_SENT, error)这样的操作,这里仍然是前面提到的更新sms表中type字段,会将其值设置成2,表示已发送成功,这时界面会将正在发送改成已发送状态,界面的实现是监听了数据库,那一旦数据库有改变就会更新界面,这里就不累述了,在短信的接收里有提到。

4、总结

    短信群发其实和但条短信发送没有什么区别,前一条短信发送完成后,紧接着再发送第二条短信,这里由于担心前面发送单条短信的流程讲解的不是很清楚,这里做了一些简单的补充,希望有助于大家对短信发送的理解。


    
[3] 筹建LibGDX引擎开发环境
    来源: 互联网  发布时间: 2014-02-18
搭建LibGDX引擎开发环境

从http://libgdx.badlogicgames.com/nightlies/dist/gdx-setup-ui.jar下载gdx-setup-ui.jar

下载完成后直接双击此文件或在命令行里执行

java -jar gdx-setup-ui.jar

即可打开LibGDX创建工程的窗口,也可以通过这个程序来下载LibGDX的开发包。


如图,如果左侧"LibGDX"为红色,说明程序还没有关联到LibGDX开发包。

点击红框中的那个按钮即可在线下载开发包。

下载完成后就可以创建工程了,非常方便。


    
最新技术文章:
▪Android开发之登录验证实例教程
▪Android开发之注册登录方法示例
▪Android显式启动与隐式启动Activity的区别介绍 iis7站长之家
▪Android实现将已发送的短信写入短信数据库的...
▪Android发送短信功能代码
▪Android根据电话号码获得联系人头像实例代码
▪Android中GPS定位的用法实例
▪Android实现退出时关闭所有Activity的方法
▪Android实现文件的分割和组装
▪Android录音应用实例教程
▪Android双击返回键退出程序的实现方法
▪Android实现侦听电池状态显示、电量及充电动...
▪Android获取当前已连接的wifi信号强度的方法
▪Android实现动态显示或隐藏密码输入框的内容
▪根据USER-AGENT判断手机类型并跳转到相应的app...
▪Android Touch事件分发过程详解
▪Android中实现为TextView添加多个可点击的文本
▪Android程序设计之AIDL实例详解
▪Android显式启动与隐式启动Activity的区别介绍
▪Android按钮单击事件的四种常用写法总结
▪Android消息处理机制Looper和Handler详解
▪Android实现Back功能代码片段总结
▪Android实用的代码片段 常用代码总结
▪Android实现弹出键盘的方法
▪Android中通过view方式获取当前Activity的屏幕截...
▪Android提高之自定义Menu(TabMenu)实现方法
▪Android提高之多方向抽屉实现方法
▪Android提高之MediaPlayer播放网络音频的实现方法...
▪Android提高之MediaPlayer播放网络视频的实现方法...
▪Android提高之手游转电视游戏的模拟操控
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,