顯示具有 android 標籤的文章。 顯示所有文章
顯示具有 android 標籤的文章。 顯示所有文章

修復 cocos2dx v2.x 版 OpenSSL 過期的錯誤

文章撰寫日期︰2014/12/29 18:50
文章修改日期︰2014/12/30 10:20
文章修改次數︰1

一、問題

今天收到Google寄來的一封信,
跟我說我目前用的Cocos2d-x的OpenSSL協議版號過舊,
APK即將被強迫下架,
需要我盡快更新並重新上架。

內容如下︰
Your app is running an outdated version of OpenSSL, which has multiple security vulnerabilities. You should update OpenSSL as soon as possible.

The vulnerabilities were addressed in OpenSSL versions beginning with 1.0.1h, 1.0.0m, and 0.9.8za. To confirm your OpenSSL version, you can do a grep via ("$ unzip -p YourApp.apk | strings | grep "OpenSSL""). For more information about the vulnerability, please consult http://www.openssl.org/news/secadv_20140605.txt.

To confirm that you’ve upgraded correctly, upload the updated version to the Developer Console and check and after five hours.

This is the second warning we’ve sent you. Please note, while it's unclear whether these specific issues affect your application, applications with vulnerabilities that expose users to risk of compromise may be considered “dangerous products” and subject to removal from Google Play.

二、解決辦法

查了一下原來使cocos2dx引擎內建的OpenSSL版號使用過舊。

而前一陣子Google已經發表新聞稿(15年OpenSSL漏洞影響Android版Chrome,Google發布緊急更新),
因此也開始在抓OpenSSL過舊的APK。

請下載Cocos2dX v.2.x版更新檔並覆蓋取代底下的資料夾位置
/cocos2d-x/cocos2dx/platform/third_party/android/prebuilt/libcurl/libs

armeabi/libcurl.a覆蓋原來的armeabi/libcurl.a
armeabi-v7a/libcurl.a覆蓋原來的armeabi-v7a/libcurl.a
x86/libcurl.a覆蓋原來的x86/libcurl.a

如果下載連結失效,亦可至Github下載。

倘若用的是Cocos2dX v3.x版,請至此下載。

更新完後,記得刪掉整個編譯出來的Android遊戲專案資料夾so檔,路徑如下
您的Android遊戲專案/proj.android/obj/local

並 $./build_native.sh 重新編譯您的遊戲專案即可修復問題。

三、其它

如果要知道現在apk使用OpenSSL的版號,
推薦一隻App︰Heartbleed Scanner。

參考來源

1. cocos2dx官方論壇

LOCAL_SRC_FILES points to a missing file

文章撰寫日期︰2014/09/15 16:11
cocos2d-x使用版本︰2.1.1-beta3

一、問題

今天在編譯cocos2dx時,
遇到

LOCAL_SRC_FILES points to a missing file 

cocos2dx/platform/third_party/android/prebuilt/libjpeg/libs/armeabi/libjpeg.a exists  or that its path is correct

的問題。



二、解決辦法


現在(2014/09/15,目前最新是cocos2dx3.2版)在Github上的cocos2dx,
在checkout到舊版(2.1.1-beta3)時,
cocos2dx/platform/third_party/android/prebuilt目錄底下的檔案已不齊全,
這造成Android專案在build_native.sh時,
因為遺失相關檔案造成無法成功編譯遊戲成為.so檔。

將這裡提供的檔案解壓縮覆蓋掉libcurl、libjpeg、libpng、libtiff四個檔即可解決問題。

[cocos2d-x JSB篇]輕易從Javascript跟cpp與Native溝通的工具︰「EasyJSB」

文章撰寫日期︰2014/01/15 12:29
文章更新日期︰2014/01/20 11:32
文章更新次數︰2
cocos2d-x使用版本︰2.2.2
文章來源︰小鰻的cocos2d-x學習筆記

If you famillar with english, please turn to this essay.

一、前言

圖片說明了在cocos2d-JSB的開發環境中,
EasyNDK及EasyJSB各自的定位與角色。


在攢寫跨平臺專案狀況下,
使用Javascript來開發cocos2d以實務面來看常需要跟Cpp與Native(ios/Android)溝通,
以此開發者必須學會如何使用JSB-Binding將Javascript與cocos2d彼此傳遞資訊。

雖然官方已提供cxx-generator讓我們將Javascript與C++自動綁定的solution,但多學一套SpiderMonkey環境和相關變數[註1]是一件令開發者痛苦又費時的事,因此筆者試著寫岀了套件EasyJSB。

該套件架構在EasyNDK底下,
因此使用EasyJSB的同時,
也需要同時候用EasyNDK套件。






[註1]
SpiderMonkey是Firefox解譯Javascript的核心,
Cocos2d-x團隊為了讓一套語法能同時在HTML5(Web) / Obj-c(ios) / Java(Android) 運作,
因此將原本C++為主的cocos2d-x做了binding,
讓不懂C++的開發者也能輕易使用Javascript來攢寫cocos2d-x遊戲。

二、文章開始

第1步 至Github下載EasyJSB

先到Github下載EasyJSB套件或至cocos2dx\projects目錄底下,
打上指令
$git clone https://github.com/lp43/EasyJSB.git

在Xcode中開啟EasyJSB專案

約過10分鐘後專案下載完成,
即可直接至底下proj.ios目錄開啟Xcode專案。

在Eclipse中開啟EasyJSB專案

 

匯入後,
就會在Ecipse裡看到EasyJSB專案了。
將obj資料夾底下全部檔案刪除並重新編譯cocos2d-x。
完成後即可執行專案。

[cocos2d-x / Android篇]教學4︰在Eclipse專案裡使用EasyNDK

文章撰寫日期︰2013/12/29 20:04
cocos2d-x使用版本︰2.1.4

一、前言

接下來的教學跟前三篇昔昔相關,
建議先理解ios端使用EasyNDK的方式,
將更好入手本篇和後面的教學。

二、文章開始

繼EasyNDK第2篇的教學,
我們在C++的Classes\HelloWorldScene.cpp關閉按鈕的函式裡寫了SendMessageWithParams呼叫Objective-C(Native)端的 函式SampleSelector 後,
現在要用一樣的方式呼叫在Android端Activity(Native)裡的 函式SampleSelector了。

第1步 匯入TestEasyNDK專案檔進Eclipse

按下確定匯入專案。

第2步 複製EasyNDK相關資源至Eclipse專案中

我們需將EasyNDK 套件檔(Cpp檔)、Android.mk(C++編譯成Android APK的範本檔)、和EasyNDK.java、EasyNDK在Android端相關的java檔 複製進Eclipse專案目錄TestEasyNDK底下
EasyNDK套件檔(cpp檔)
Android編譯C++使用的範本檔(Android.mk)
EasyNDK在Android端相關的java檔
然後再將EasyNDK.java取代建置專案時的TestEasyNDK.java,
並將AndroidManifest.xml裡的內容修改如下

第3步 重新清除並編譯專案

重新清除TestEasyNDK專案,確保C++檔重新被NDK編譯

成功了!

NDK編譯成功後,
按下右下角的關閉按鈕,
成功岀現了從C++傳來的訊息。

三、其它

附上該教學文相關資源

專案目錄最後的結構
源始碼下載

相關文章

1. 在ios端使用EasyNDK
2. 官方教學

[Android篇]使用build_native.sh時,遇到Invalid attribute name:package的問題。

文章撰寫日期︰2013/12/19 10:28
cocos2d-x使用版本︰2.1.3
NDK使用版本︰r8e

一、問題

今天在試著NDK編譯別人的案子時,
遇到

Invalid attribute name: 
    package
make: Entering directory `/Users/lp43/cocos2d-x2.1.3/workspace/38_CanShot/Source/proj.android'
/Users/lp43/Android/adt-bundle-mac/android-ndk-r8e/build/gmsl/__gmsl:512: *** non-numeric second argument to `wordlist' function: ''.  Stop.

的問題。

二、解決辦法

上網爬文後,
網友們說問題是來自於AndroidManifest.xml檔的問題。
原本這個檔是在windows上編輯,
但現在我要在mac的環境中編譯,
因此把windows上獨有的\r\n也編譯進來,
造成NDK無法在mac上順利編譯。

解決辦法有3種︰

1.使用vim工具將AndroidMenifest.xml的filetype設成unix。

用 vim 打開 AndroidManifest.xml,在命令模式下输入"set filetype=unix",保存退出即可。

2.直接更改NDK裡__gmsl檔的512行(路徑在/android-ndk-r8e/build/gmsl/__gmsl)

將原本512的
int_encode = $(__gmsl_tr1)$(wordlist 1,$1,$(__gmsl_input_int))
改成
int_encode = $(__gmsl_tr1)$(wordlist 1,$(words $1),$(__gmsl_input_int))
也可以。

3.使用指令一鍵更改AndroidManifest.xml的編碼格式

如果你跟我一樣是使用mac,
可以安裝一套軟體叫dos2Unix,
然後在terminal裡Android專案目錄打上
$dos2unix AndroidManifest.xml

也可以解決問題。

我選擇第2、3種解決方案。

參考來源

1. mingming-killer
2. stackoverflow
3. Google Group

[Android篇]build_native編譯時遇到You NDK_MODULE_PATH variable contains spaces

文章撰寫日期︰2013/12/17 14:28
cocos2d-x使用版本︰2.1.5

一、問題

今天在試著使用EasyNDK,
執行裡面的Android專案並且要build_native.sh時,
遇到
Android NDK: ERROR: You NDK_MODULE_PATH variable contains spaces    
Android NDK: Please fix the error and start again.
的錯誤。


二、解決辦法

Google了一下發現這是cocos2d-x的Bug,
表示你的NDK_MODULE_PATH涵蓋了空白字元。

將build_native.sh用文字編輯器打開,
看到NDK_MODULE_PATH指定到COCOS2DX_ROOT目錄(見下圖)。


再往下追,看到COCOS2DX_ROOT目錄設成底下(見下圖)

打開檔案總管,看到這個路徑是這樣的︰
原來設定COCOS2DX_ROOT路徑時,當中有資料夾含有空白字元。
因此一直無法使用build_native.sh編譯。

更改資料夾名稱是其中一種解決辦法。

[cocos2dx-Android篇]INVALID HEAP ADDRESS IN dlfree addr錯誤

文章撰寫日期︰2013/11/22 16:19
cocos2dx使用版本︰v 2.1.5

一、問題

今天在使用CocosBuilder開發時,
在安卓編譯執行程式後,遇到
@@@ ABORTING: INVALID HEAP ADDRESS IN dlfree addr=0x5c2db000
的問題。


二、解決辦法

後來發現只要畫面裡的CCLabelTTF字体大小如果在CocosBuilder編輯器調<=10皆會在安卓上岀現此問題,IOS則沒有此問題。

[JSB篇]Android端使用返回鍵(在CocosBuilder的使用狀況下)

文章撰寫日期︰2013/11/14 14:27
cocos2dx使用版本︰v 2.1.4

一、前言

Android的返回鍵使用,
在Cocos2d-x-JSB的環境下,
很多人都摸不著頭緒不知道如何使用。
這裡提供我所使用而且也成功控制到back key的方式。

二、文章開始

這篇假設你的每個JS檔是和CocosBuilder綁定使用的。
因此你的Code裡應該有支援onDidLoadFromCCB()這個CocosBuilder給你的callback函式。
var MyScene = function(){

 this.onDidLoadFromCCB = function()
 {
  cc.log("into MyScene onDidLoadFromCCB");

        //添加Android返回鍵控制
        if( sys.os == "android" || sys.os == "Android") {

            //務必啟動KeypadEnabled
            this.rootNode.setKeypadEnabled(true);

            this.rootNode.backClicked = function(){
                cc.log("into MyScene backClicked");

                //做任何Android back key觸發後,你想做的事情。

            };
        }
        };
};
如上面Code所寫,
在綁定CocosBuilder檔後,
回傳的callback: onDidLoadFromCCB()裡,
我們去啟動KeypadEnabled,
並同時將backClicked()函式實作完成。

由於這個MyScene.js檔的this在綁定CocosBuilder(ccb)檔後,
this指的是ccbi畫面層(畫面第2層),
原來的CCLayer層(畫面頂層)就要用this.rootNode來取得。

Cocos2d-x的基本生命週期函式像
onEnter()、onExit()、onUpdate()...
也都要用this.rootNode的方式,
才能使用並取得到他們。

[JSB-Android篇]XmlHttpRequest元件在Android端使用回傳reponse failed

無法查看此摘要。請 按這裡查看文章。

[JSB-Androdi篇]遇到Errors running builder 'Integrated External Tool Builder' on project 'xxx'

文章撰寫日期︰2013/08/24 04:04
cocos2dx使用版本︰v 2.1.4
cocosBuilder使用版本︰v 3.0 alpha 5

一、問題

在專案初始化啟動後, Eclipse岀現下列狀況︰

Errors running builder 'Integrated External Tool Builder' on project 'xxx'.


二、解決辦法


將底下的這個工具(Invalid External Tool Builder)移除即可

[Android篇]建立一個cocos2D-Android專案

cocos2dx使用版本︰v 2.0.4
cocosBuilder使用版本︰v 2.0 alpha 1

一、前提

如果NDK是放在D槽
請先設定環變
export NDK_ROOT=/cygdrive/d/Android/cygwin/android-ndk-r8

二、步驟

  1. 創立一個cocos2Dx-Android專案

    先下在cocos2Dx目錄底下,
    輸入create-android-project.bat指令
    註︰不能在Cygwin環境下執行。使用前請先將create-android-project.sh和create-android-project.bat裡的預設目錄設好。
  2.  針對這個專案目錄內執行build_native.sh

    創建完後,
    針對這個專案目錄內執行build_native.sh
    即可完成Android專屬的cocos2D專案
    即可使用Eclipse匯入修改。

     3.如果org.cocos2dx目錄遺失

In cocos2d-x 2.0.3 ...Cocos2d-x Lib java files has been considered as a different project only So import that project in the eclipse
Lets make it Simple
  1. First Import the project in eclipse from this path - cocos2d-2.0-x-2.0.3/cocos2dx/platform/android/java
You will see libcocos2dx project in eclipse ...Keep this project open always otherwise your projects will give error on the syntax of library
  1. Run create-android-project
  2. Now Import the project which you have created and just Run (If you know the concept of isLibrary then that's how they are maintaining it now ..)
Also additional information to run build-native.sh from eclipse only , Right Click Project ->C/C++ Build Uncheck Use Default Build COmmand and add following bash ${workspace_loc:/YourProjName}/build_native.sh NDK_DEBUG=1 V=1
Good Luck ..If any question please feel free to ask


三、其它

無法在Visual Studio 2012 Express安裝Cocos2DX template
Editing InstallWizardForVS2012.js located in cocos2D\template\msvc
Line 92, replace vcprojects with vcprojects_WDExpress then run install-templates-msvc.bat and templates will be installed succesfully in VS 2012 Express.
var strDestFolder = FileSys.BuildPath(strValue, "vcprojects_WDExpress");

相關網址︰
1.
2. 跨平臺開發IOS & Android版(中文)
3. 跨平臺開發IOS & Android版(原文)
4. 設定Windows底下的開發環境
5. 建置Cocos2D-X並用Eclipse引入
6. 新建專案後不用COPY一堆Lib的做法
7.

[cocosBuilder]Android端無法使用sub-ccb

文章撰寫日期︰2013/08/15 15:00
cocos2dx使用版本︰v 2.0.4
cocosBuilder使用版本︰v 2.0 alpha 1

一、問題

遇到了sub-ccb資源無法在Android讀取,
embeddedNode->setPosition(ccbFileNode->getPosition());這句報BAD_ACCESS的問題。

遇到這個問題幾乎可以說ccbReader沒有在Resources資源下找到欲使用的sub-ccb資源。

解釋一下我的資料結構,
右圖是我目前cocosBuilder的路徑狀況。

Brain.ccb裡面用了Cursor.ccb當成sub ccb,
但在Android裡卻因為這個路徑結構,
而導致無法找到Cursor.ccb,
IOS則是執行正常。


二、解決辦法

仔細與TestCpp示範專案比對後,
發現有一個核取方塊我打了勾(見下圖)︰
Flatten paths when publishing這個選項在官方文件的註釋如下︰
cocosBuilder的專案路徑預設是在Resources根目錄下,也就是說,倘若今天你有mySubDirectory/myImage.png要被cocosBuilder使用,在放置檔案時,你也不能放在mySubDirectory目錄底下,而是要直接放在Resources根目錄下。
如果要用相對位置的方法取得資源,那麼這個核取方塊要取消,而且在Xcode專案中,要使用藍色資料夾引用圖檔資源(如右)。

這麼做以後,Android也能找到Resources裡根目錄的資源了。

[Android-JNI篇]Fatal signal 11,找不到JNI函式

文章撰寫日期︰2013/07/17 11:42
cocos2dx使用版本︰v 2.0.4
cocosBuilder使用版本︰v 2.0 alpha 1

一、問題

今天在寫JNI試圖從C++ call JAVA時,
遇到了
Fatal signal 11 (SIGSEGV) xxxx
的問題,
告訴我找不到JAVA層的某個static函式。


二、解決辦法

JAVA端的Code如下
package com.simon.utility;
public class DataManager {
 public static void test(){
  
  Log.i("tag", "into test");
 }
}
 
C++端使用JNI呼叫上面的Java函式
void FileOperator::getAndroidTest(){
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
    CCLog("into FileOperator::getAndroidTest(), Involking JNI...");
    
    JniMethodInfo t;
    
    if (JniHelper::getStaticMethodInfo(t, "com/simon/utility/DataManager","test","()V;"))
    {
        CCLog("classID: %d",t.classID);
                CCLog("methodID: %d",t.methodID);
        t.env->CallStaticBooleanMethod(t.classID,t.methodID);
        
    }
#endif
}
 
程式一直跟我報找不到test這個函式,
後來才知道()V;那邊
V後面不用打分號!

題外話︰
()是JAVA端接收參數的值
V是這隻JAVA函式是否有回傳值。

[Android篇]無法使用GET/POST

文章撰寫日期︰2013/07/05 15:37
cocos2dx使用版本︰v 2.0.4
cocosBuilder使用版本︰v 2.0 alpha 1

一、問題

今天使用cocos2dx提供的CCHttpRequest跟伺服器發出GET/POST請求時,
Android端一直無法取得到正確資料,出現以下的LOG︰
response failed
error buffer: Couldn't resolve host 'xxxxxxx.amazonaws.com'

二、解決辦法

這是因為沒有開啟Android端的用戶權限。

註︰
Google對於每一隻APP需要使用到的權限,
都要求開發者必須在AndroidMenifest.xml裡註冊,
這是為了讓Google Play可以在提供使用者下載的地方,
show出這隻APP需要哪些資訊。

如︰這隻APP需要有上網能力、需要讀取您的通訊錄、需要讀取您的外部SD卡等等⋯

Android端的User-Permission需要加入Internet這個Permission。
〈uses-permission android:name="android.permission.INTERNET"/〉

加入後,就能在Android端GET/POST取到資料了。

[Android篇]call to OpenGL ES API with no current context (logged once per thread)

文章撰寫日期︰2013/04/16 13:25
cocos2dx使用版本︰v 2.0.4
cocosBuilder使用版本︰v 2.0 alpha 1

一、問題

今天試圖使用JNI從Java(Android)層呼叫C++(Cocos2d-x)層,
讓Cocos2d-x換場景(replaceScene),
卻遇到Eclipse報
  1. Fatal signal 11 (SIGSEGV) at xxxxxxxx (code=1), thread xxxx (xxxxxx)
  2. call to OpenGL ES API with no current context (logged once per thread)
的錯誤。

二、解決辦法

這個問題是因為Android在啟動cocos2d-x的Thread時,
不是用context的主Thread,
而是另外產生OpenGL的Thread,
所以我們不能用主Thread去讓cocos2dx做OpenGL Thread原本應該做的工作(replaceScene),
要用OpenGL的Thread去完成︰

JAVA端-Cocos2dxActivity.java
//要用Cocos2dxActivty這個Activity去調用runOnGLThread!
Cocos2dxActivity.this.runOnGLThread(new Runnable(){

    @Override
    public void run() {
           replaceScene();
        }
    });

    public static native void replaceScene();
    static {
        System.loadLibrary("game");
   }

C++端
JNIEXPORT void JNICALL Java_com_hardworking_millioinschool_ios_Cocos2dxActivity_replaceScene(JNIEnv *env, jobject thiz)
{
    
    //切到主遊戲頁
    CCScene *pScene = TitleScene::scene();
    CCDirector::sharedDirector()->replaceScene(pScene);
    
}

相關文章

1. 雜物聚集地

[Android篇]Back鍵無法關閉cocos2d-x遊戲

文章撰寫日期︰2013/03/20 17:30
cocos2dx使用版本︰v 2.0.4
cocosBuilder使用版本︰v 2.0 alpha 1

一、問題

按下Android的返回鍵,
有時候關的掉遊戲,
有時候關不掉。

二、解決辦法

查文後得知Cocos2dxActivity.java裡的onKeyDown是假的,
觸控權早已交到了Cocos2dxGLSurfaceView.java的onKeyDown手上...

再追下去,
發現backKey交給了Native,
也就是cpp那邊會呼叫backKey按下去後的實作。

後來,
知道要實作init函式,
並將setKeypadEnabled(true);
然後再寫一個
void DoorAnimationScene::keyBackClicked(){
    CCLog("into DoorAnimationScene::keyBackClicked()");
    CCDirector::sharedDirector()->end();
}

結束。

[Android篇]使用CCLabelTTF換行會漏字(最後一個字不見)的問題

文章撰寫日期︰2013/03/20 10:35
cocos2dx使用版本︰v 2.0.4
cocosBuilder使用版本︰v 2.0 alpha 1

一、問題

針對CCLabelTTF設定setDimensions,
想要做到文字過長會自動換行的效果,
在IOS上能正常顯示,
Android上卻會被截掉每一行的最後一個字元的問題。

請參見下圖示意的題目的部份
畫面在IOS上的樣子
畫面在Android上的樣子
可以看到,
"一條尾巴"後面的"逗號"在Android上不見了。

二、解決方法

與Cocos2dX開發人員詢問後,
發現此問題是2.0.x的一個bug,
已經在cocos2d-x 2.1.x獲得改善,
可參見它們的更新LOG #1610。
Bug   #1610: fix a bug that CCLabelTTF will lost a character at the end of a line
 
解決方法是將cocos2d-x在Android上的一個類別
Cocos2dxBitmap.java line 298

while (pString.indexOf(i++) == ' ') {
 ;
}
改成
while (pString.indexOf(i) == ' ') {
          ++i;
}
記得,
cocos2dx/cocos2dx/platform/android/java/src/org/cocos2dx/lib/Cocos2dxBitmap.java也要改掉。

免得之後建立的新Android-Cocos2dx專案又遇到同樣的問題。

[Android篇]NDK編譯Cocos2Dx時遇到error: undefined reference to 'xxxx'

文章撰寫日期︰2013/03/01 18:20
cocos2dx使用版本︰v 2.0.4
cocosBuilder使用版本︰v 2.0 alpha 1

一、問題

NDK編譯cocos2d-x時,
遇到了error: undefined reference to 'xxxScene::xxxSceneLayer()'的問題,
造成無法編譯。

二、解決辦法

請在Android.mk加入xxxScene的腳本即可解決。

[Android篇]NDK編譯Cocos2dx時遇到lhConfig.h : No such file or directory

文章撰寫日期︰2013/03/01 18:11
cocos2dx使用版本︰v 2.0.4
cocosBuilder使用版本︰v 2.0 alpha 1

一、問題

使用Android NDK編譯Cocos2d-X時,
遇到
jni/../../Classes/LevelHelper/Nodes/LHSprite.cpp:27:22: fatal error: lhConfig.h: No such file or directory
的問題。

二、解決辦法

在LHSprite.cpp 第27行,
將
#include "lhConfig.h"
改成
#include "../lhConfig.h"
其它還需要修改的地方為 LHBezier.cpp line 30

[cocos2d-x篇]'jni.h' file not found

文章攢寫時間︰2013/02/14 19:15
文章修改時間︰2013/03/09 15:32
文章修改次數︰2
cocos2dx使用版本︰v 2.0.4
cocosBuilder使用版本︰v 2.0 alpha 1

一、問題

在編譯cross-platform時遇到'jni.h' file not found的錯誤。

二、解決辦法

由於Android lib要置入CocosDenshion\android才能跨系統透過JNI控制Android的音控,
將Xcode裡CocosDenshion\android資料夾移除Reference即可。

因為jni.h要在Android編譯時才會找到。