天天看點

4399支付SDK供flash遊戲使用ANE的使用

 這兩天對Flash遊戲如何去接入android平台的SDK做了下研究,做了4399的支付SDK接入的工作,這裡與大家分享下。

一、ANE的介紹

Adobe AIR Native Extension,Adobe AIR的本地擴充,簡稱ANE。什麼叫本地擴充?因為Adobe AIR是跨平台的一個運作時,可以在Windows,Mac,Android,iOS等系統上跑,正是因為其跨平台,是以它本身的功能就有局限性,不可能面面俱到;換句話來說,比如我們想在flash程式中調用一下系統的消息通知功能,但是AIR并沒有這個功能,那麼怎麼辦?這就要根據本地平台寫段代碼,讓AIR委托本地平台去執行這段代碼,這樣就達到了拓展AIR程式的功能。換個角度來看問題,就好像系統有個dll檔案,AIR可以去直接調用這個dll檔案(這隻是一個比方而已,讓大家更容易了解,實際上AIR不能直接調用dll檔案)。我們可以開發一個Android手機振動程式,然後打包成ANE,這樣運作在AIR中的程式就可以調用寫好的手機程式了。有了ANE機制,我們就可以開發很多Flash無法完成但是卻可以使用的功能。

二、ANE開發步驟

 ANE的生成需要兩個步驟,一個是生成本地的jar包,一個生成SWC庫檔案,最後進行編譯合成。

  本文開發工具為fb 4.7 與eclipse為主

1、建立ane Android項目,生成本地jar包

準備工作

1)在eclipse中建立一個android的項目,假定命名為4399PaySDKANE_JAVA;

2) 将需要依賴的包(4399PaySdk.jar和FlashRuntimeExtensions.jar)添加到項目的libs目錄下。

3)在項目屬性中-java build path-Libraries下,添加以下

4399PaySdk.jar(4399的支付sdk包,在http://opensj.4399api.net/dev/downloadExchange可以下載下傳到)

FlashRuntimeExtensions.jar(該包在E:\softinstall\ADOBE\Adobe Flash Builder 4.7\sdks\4.6.0\lib\android可找到)

4)在項目屬性 - Java Build Path - Order and Export 下,将遊戲 SDK 及其依賴的 JAR 包(4399PaySdk.jar)打上勾,確定能夠被輸出到生成的 JAR 包中;

準備工作有些多哈。接下來正式進入開發。

編碼部分:

1、編寫 FREContext 的派生類(YJPaymentApiContext.java)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

<code>package</code> <code>com.sj4399.pay.ane;</code>

<code>import</code> <code>java.util.HashMap;</code>

<code>import</code> <code>java.util.Map;</code>

<code>import</code> <code>com.adobe.fre.FREContext;</code>

<code>import</code> <code>com.adobe.fre.FREFunction;</code>

<code>public</code> <code>class</code> <code>YJPaymentApiContext </code><code>extends</code> <code>FREContext {</code>

<code>                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   </code> 

<code>    </code><code>@Override</code>

<code>    </code><code>public</code> <code>void</code> <code>dispose() {</code>

<code>    </code><code>}</code>

<code>    </code><code>public</code> <code>Map&lt;String, FREFunction&gt; getFunctions() {</code>

<code>                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          </code> 

<code>        </code><code>return</code> <code>null</code><code>;</code>

<code>}</code>

空的檔案先不管。

2、編寫 FREExtension 的派生類(如:YJPaymentApiExtension),在 createContext 方法中建立 YJPaymentApiContext的執行個體,并作為該方法的結果值傳回。

17

18

19

<code>import</code> <code>com.adobe.fre.FREExtension;</code>

<code>public</code> <code>class</code> <code>YJPaymentApiExtension </code><code>implements</code> <code>FREExtension {</code>

<code>    </code><code>public</code> <code>FREContext createContext(String arg0) {</code>

<code>        </code><code>// TODO Auto-generated method stub</code>

<code>                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           </code> 

<code>        </code><code>return</code> <code>new</code> <code>YJPaymentApiContext();</code>

<code>    </code><code>public</code> <code>void</code> <code>initialize() {</code>

3、編寫一系列 FREFunction 的派生類(如:YJFInit,YJFLogin……等),以實作每一個接口,每個接口方法用一個 FREFunction 派生類實作;

以YJFInit.java為例

<code>import</code> <code>com.adobe.fre.FREObject;</code>

<code>import</code> <code>com.sj4399.pay.YjPaymentApi;</code>

<code>public</code> <code>class</code> <code>YJFInit </code><code>implements</code> <code>FREFunction {</code>

<code>    </code><code>private</code> <code>static</code> <code>final</code> <code>String TAG = </code><code>"YJFInit"</code><code>;</code>

<code>    </code><code>public</code> <code>FREObject call(FREContext context, FREObject[] args) {</code>

<code>                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     </code> 

<code>        </code><code>YJPaymentApiContext yjac = (YJPaymentApiContext)context;</code>

<code>        </code><code>YjPaymentApi.getInstance().init(yjac.getActivity());</code>

我們通過

<code>context.dispatchStatusEventAsync(callbackString, </code><code>""</code><code>);</code>

進行回調給as3端。編寫完其他接口類即可。

4、修改 YJPaymentApiContext的 getFunctions 方法,将實作的每一個 FREFunction 派生類添加到函數集合中,該函數集合作為該方法的結果值傳回;此函數集合即承擔接口調用職責

20

21

22

<code>                                                                                                                                                                                                                                                                                                                                                                                                                                                   </code> 

<code>        </code><code>Map&lt;String, FREFunction&gt; mapFunc = </code><code>new</code> <code>HashMap&lt;String, FREFunction&gt;();</code>

<code>        </code><code>mapFunc.put(</code><code>"getUser"</code><code>, </code><code>new</code> <code>YJFGetUser());</code>

<code>        </code><code>mapFunc.put(</code><code>"charge"</code><code>, </code><code>new</code> <code>YJFCharge());</code>

<code>        </code><code>mapFunc.put(</code><code>"destoryLogin"</code><code>, </code><code>new</code> <code>YJFLogout());</code>

<code>        </code><code>mapFunc.put(</code><code>"openLogin"</code><code>, </code><code>new</code> <code>YJFLogin());</code>

<code>        </code><code>mapFunc.put(</code><code>"init"</code><code>, </code><code>new</code> <code>YJFInit());</code>

<code>                                                                                                                                                                                                                                                                                                                                                                                                                                                          </code> 

<code>        </code><code>return</code> <code>mapFunc;</code>

5、編寫 ant 配置檔案 build.xml,編譯導出 JAR 包

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

<code>&lt;?</code><code>xml</code> <code>version</code><code>=</code><code>"1.0"</code> <code>encoding</code><code>=</code><code>"UTF-8"</code> <code>?&gt;</code>

<code>&lt;</code><code>project</code> <code>name</code><code>=</code><code>"4399paysdk"</code> <code>basedir</code><code>=</code><code>"."</code> <code>default</code><code>=</code><code>"exportJar"</code><code>&gt;</code>

<code>                                                                                                                                                                                                                                                                                                                                                                                                                                  </code> 

<code>    </code><code>&lt;!-- 設定全局變量 --&gt;</code>

<code>    </code><code>&lt;</code><code>property</code> <code>name</code><code>=</code><code>"src.dir"</code> <code>value</code><code>=</code><code>"src"</code> <code>/&gt;</code>

<code>    </code><code>&lt;</code><code>property</code> <code>name</code><code>=</code><code>"classes.dir"</code> <code>value</code><code>=</code><code>"bin/classes"</code> <code>/&gt;</code>

<code>    </code><code>&lt;</code><code>property</code> <code>name</code><code>=</code><code>"dist.dir"</code> <code>value</code><code>=</code><code>"dist"</code> <code>/&gt;</code>

<code>    </code><code>&lt;</code><code>property</code> <code>name</code><code>=</code><code>"jar.file"</code> <code>value</code><code>=</code><code>"4399PaySDKANEJava.jar"</code> <code>/&gt;</code>

<code>    </code><code>&lt;</code><code>property</code> <code>name</code><code>=</code><code>"classes.encode"</code> <code>value</code><code>=</code><code>"UTF-8"</code> <code>/&gt;</code>

<code>    </code><code>&lt;</code><code>property</code> <code>name</code><code>=</code><code>"libs.dir"</code> <code>value</code><code>=</code><code>"libs"</code> <code>/&gt;</code>

<code>                                                                                                                                                                                                                                                                                                                                                                                                                                </code> 

<code>    </code><code>&lt;</code><code>path</code> <code>id</code><code>=</code><code>"classpath"</code><code>&gt;</code>

<code>        </code><code>&lt;</code><code>fileset</code> <code>dir</code><code>=</code><code>"${libs.dir}"</code><code>&gt;</code>

<code>            </code><code>&lt;</code><code>include</code> <code>name</code><code>=</code><code>"**/*.jar"</code> <code>/&gt;</code>

<code>        </code><code>&lt;/</code><code>fileset</code><code>&gt;</code>

<code>        </code><code>&lt;</code><code>fileset</code> <code>dir</code><code>=</code><code>"E:\softinstall\Java\jdk1.6.0_24\jre\lib"</code><code>&gt;</code>

<code>        </code><code>&lt;</code><code>fileset</code> <code>dir</code><code>=</code><code>"E:\soft\android\adt-bundle-windows-x86\sdk\platforms\android-8"</code><code>&gt;</code>

<code>            </code><code>&lt;</code><code>include</code> <code>name</code><code>=</code><code>"android.jar"</code> <code>/&gt;</code>

<code>        </code><code>&lt;</code><code>fileset</code> <code>dir</code><code>=</code><code>"E:\softinstall\ADOBE\Adobe Flash Builder 4.7\sdks\4.6.0\lib\android"</code><code>&gt;</code>

<code>            </code><code>&lt;</code><code>include</code> <code>name</code><code>=</code><code>"FlashRuntimeExtensions.jar"</code> <code>/&gt;</code>

<code>    </code><code>&lt;/</code><code>path</code><code>&gt;</code>

<code>                                                                                                                                                                                                                                                                                                                                                                                                                                      </code> 

<code>    </code><code>&lt;</code><code>target</code> <code>name</code><code>=</code><code>"init"</code><code>&gt;</code>

<code>        </code><code>&lt;!-- Create the time stamp --&gt;</code>

<code>        </code><code>&lt;</code><code>tstamp</code> <code>/&gt;</code>

<code>    </code><code>&lt;/</code><code>target</code><code>&gt;</code>

<code>    </code><code>&lt;!-- 編譯源檔案 --&gt;</code>

<code>    </code><code>&lt;</code><code>target</code> <code>name</code><code>=</code><code>"buildFiles"</code> <code>depends</code><code>=</code><code>"init"</code><code>&gt;</code>

<code>        </code><code>&lt;</code><code>echo</code> <code>message</code><code>=</code><code>"start building ....."</code> <code>/&gt;</code>

<code>        </code><code>&lt;</code><code>delete</code> <code>dir</code><code>=</code><code>"${classes.dir}"</code> <code>/&gt;</code>

<code>        </code><code>&lt;</code><code>mkdir</code> <code>dir</code><code>=</code><code>"${classes.dir}"</code> <code>/&gt;</code>

<code>        </code><code>&lt;</code><code>javac</code> <code>deprecation</code><code>=</code><code>"on"</code> <code>debug</code><code>=</code><code>"on"</code> <code>encoding</code><code>=</code><code>"${classes.encode}"</code> <code>srcdir</code><code>=</code><code>"${src.dir}"</code> <code>destdir</code><code>=</code><code>"${classes.dir}"</code> <code>classpathref</code><code>=</code><code>"classpath"</code> <code>source</code><code>=</code><code>"1.6"</code> <code>target</code><code>=</code><code>"1.6"</code> <code>includeAntRuntime</code><code>=</code><code>"false"</code> <code>/&gt;</code>

<code>        </code><code>&lt;</code><code>copy</code> <code>todir</code><code>=</code><code>"${classes.dir}"</code><code>&gt;</code>

<code>            </code><code>&lt;!-- copy config files --&gt;</code>

<code>            </code><code>&lt;</code><code>fileset</code> <code>dir</code><code>=</code><code>"${src.dir}"</code> <code>includes</code><code>=</code><code>"**/*.properties,**/*.xml,**/*.bsh,**/*.logic, **/*.hbm"</code> <code>/&gt;</code>

<code>        </code><code>&lt;/</code><code>copy</code><code>&gt;</code>

<code>    </code><code>&lt;!-- 導出jar檔案 --&gt;</code>

<code>    </code><code>&lt;</code><code>target</code> <code>name</code><code>=</code><code>"exportJar"</code> <code>depends</code><code>=</code><code>"buildFiles"</code><code>&gt;</code>

<code>        </code><code>&lt;</code><code>delete</code> <code>dir</code><code>=</code><code>"${dist.dir}"</code> <code>/&gt;</code>

<code>        </code><code>&lt;!-- Create the distribution directory --&gt;</code>

<code>        </code><code>&lt;</code><code>mkdir</code> <code>dir</code><code>=</code><code>"${dist.dir}"</code> <code>/&gt;</code>

<code>        </code><code>&lt;</code><code>jar</code> <code>destfile</code><code>=</code><code>"${dist.dir}/${jar.file}"</code> <code>basedir</code><code>=</code><code>"${classes.dir}"</code><code>&gt; </code>

<code>            </code><code>&lt;</code><code>zipfileset</code> <code>excludes</code><code>=</code><code>"META-INF/*.SF"</code> <code>src</code><code>=</code><code>"${libs.dir}/4399PaySdk.jar"</code><code>/&gt;</code>

<code>                                                                                                                                                                                                                                                                                                                                                                                                                                          </code> 

<code>        </code><code>&lt;/</code><code>jar</code><code>&gt;        </code>

<code>        </code><code>&lt;</code><code>copy</code> <code>todir</code><code>=</code><code>"${basedir}/../ane"</code> <code>file</code><code>=</code><code>"${dist.dir}/${jar.file}"</code> <code>/&gt;</code>

<code>&lt;/</code><code>project</code><code>&gt;</code>

這樣就完成了本地jar包的生成工作了。

2、建立flex庫項目,生成swc庫

準備工作:

1)建立項目

<a href="http://s3.51cto.com/wyfs02/M01/22/85/wKioL1Mfym6wAzwSAAIC2wb9fL0946.jpg" target="_blank"></a>

2)屬性設定

<a href="http://s3.51cto.com/wyfs02/M01/22/84/wKiom1Mfyw-wm420AAKqRUbLYTw291.jpg" target="_blank"></a>

這邊使用單例模式,建立actionscript代碼

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

<code>package</code> <code>com.sj4399.pay.ane</code>

<code>{</code>

<code>    </code><code>import</code> <code>flash.events.EventDispatcher;</code>

<code>    </code><code>import</code> <code>flash.events.IEventDispatcher;</code>

<code>    </code><code>import</code> <code>flash.events.StatusEvent;</code>

<code>    </code><code>import</code> <code>flash.external.ExtensionContext;</code>

<code>                                                                                                                                                                                                                                                                                                                                      </code> 

<code>    </code><code>public</code> <code>class</code> <code>YjPaymentApi </code><code>extends</code> <code>EventDispatcher</code>

<code>    </code><code>{</code>

<code>        </code><code>public</code> <code>static</code> <code>const</code> <code>EXTENSION_ID:</code><code>String</code> <code>= </code><code>"com.sj4399.pay.ane.android"</code><code>;</code>

<code>                                                                                                                                                                                                                                                                                                                                          </code> 

<code>        </code><code>private</code> <code>var</code> <code>_context:ExtensionContext;</code>

<code>        </code><code>private</code> <code>static</code> <code>var</code> <code>_instance:YjPaymentApi;</code>

<code>                                                                                                                                                                                                                                                                                                                                           </code> 

<code>        </code><code>public</code> <code>static</code> <code>function</code> <code>getInstance():YjPaymentApi{</code>

<code>            </code><code>if</code><code>(_instance == </code><code>null</code><code>){</code>

<code>                </code><code>_instance = </code><code>new</code> <code>YjPaymentApi();</code>

<code>            </code><code>}</code>

<code>            </code><code>return</code> <code>_instance </code><code>as</code> <code>YjPaymentApi;</code>

<code>        </code><code>}</code>

<code>        </code><code>public</code> <code>function</code> <code>YjPaymentApi(target:IEventDispatcher=</code><code>null</code><code>)</code>

<code>        </code><code>{</code>

<code>            </code><code>_context = ExtensionContext.createExtensionContext(EXTENSION_ID,</code><code>null</code><code>);</code>

<code>            </code><code>if</code><code>(_context == </code><code>null</code><code>){</code>

<code>                </code><code>trace</code><code>(</code><code>"YjPaymentApi(.as) constructor: _context is null,please call 'init()' first!"</code><code>);</code>

<code>                                                                                                                                                                                                                                                                                                                                              </code> 

<code>            </code><code>_context.addEventListener(StatusEvent.STATUS,onStatus);</code>

<code>            </code><code>super</code><code>(target);</code>

<code>        </code><code>/**</code>

<code>         </code><code>* SDK初始化</code>

<code>         </code><code>*/</code>

<code>        </code><code>public</code> <code>function</code> <code>init(){</code>

<code>            </code><code>_context.call(</code><code>"init"</code><code>,</code><code>null</code><code>);</code>

<code>         </code><code>* 登入</code>

<code>        </code><code>public</code> <code>function</code> <code>openLogin(){</code>

<code>            </code><code>_context.call(</code><code>"openLogin"</code><code>,</code><code>null</code><code>);</code>

<code>         </code><code>* 登出</code>

<code>        </code><code>public</code> <code>function</code> <code>destoryLogin(){</code>

<code>            </code><code>_context.call(</code><code>"destoryLogin"</code><code>,</code><code>null</code><code>);</code>

<code>         </code><code>* 充值</code>

<code>         </code><code>* amount 充值金額</code>

<code>         </code><code>* server 分服辨別</code>

<code>         </code><code>* mark 拓展标記</code>

<code>        </code><code>public</code> <code>function</code> <code>charge(amount:</code><code>int</code><code>,server:</code><code>int</code><code>=</code><code>0</code><code>,mark:</code><code>String</code><code>=</code><code>null</code><code>){</code>

<code>            </code><code>_context.call(</code><code>"charge"</code><code>,amount,server,mark);</code>

<code>         </code><code>* 擷取使用者資訊*/</code>

<code>        </code><code>public</code> <code>function</code> <code>getUser():</code><code>String</code><code>{</code>

<code>             </code><code>return</code> <code>String</code><code>(_context.call(</code><code>"getUser"</code><code>));</code>

<code>        </code><code>private</code> <code>function</code> <code>onStatus(e:StatusEvent):</code><code>void</code><code>{</code>

<code>            </code><code>//trace("received status event:"+e.toString());</code>

<code>            </code><code>var</code> <code>eventObject:</code><code>Object</code> <code>= JSON.parse(e.code);</code>

<code>            </code><code>var</code> <code>evt:PayCallbackEvent = </code><code>new</code> <code>PayCallbackEvent(Constants.EVENT_TYPE_4399PAYSDK_CALLBACK,</code>

<code>                </code><code>eventObject.callbackType, eventObject.code, eventObject.data);</code>

<code>            </code><code>this</code><code>.dispatchEvent(evt);</code>

2、編寫PayCallbackEvent

<code>    </code><code>import</code> <code>flash.events.Event;</code>

<code>    </code><code>/**</code>

<code>     </code><code>* 支付SDK回調事件</code>

<code>     </code><code>*/</code>

<code>    </code><code>public</code> <code>class</code> <code>PayCallbackEvent </code><code>extends</code> <code>Event</code>

<code>                                                                                                                                                                                                                                                                                                                      </code> 

<code>        </code><code>private</code> <code>var</code> <code>_eventType: </code><code>String</code><code>;</code>

<code>        </code><code>private</code> <code>var</code> <code>_callbackType: </code><code>String</code><code>;</code>

<code>        </code><code>private</code> <code>var</code> <code>_code: </code><code>int</code><code>;</code>

<code>        </code><code>private</code> <code>var</code> <code>_data: </code><code>Object</code><code>;</code>

<code>        </code><code>public</code> <code>function</code> <code>PayCallbackEvent(eventType:</code><code>String</code><code>, callbackType: </code><code>String</code><code>, code: </code><code>int</code><code>, data: </code><code>Object</code><code>, bubbles:</code><code>Boolean</code><code>=</code><code>false</code><code>, cancelable:</code><code>Boolean</code><code>=</code><code>false</code><code>)</code>

<code>            </code><code>this</code><code>._eventType = eventType;</code>

<code>            </code><code>this</code><code>._callbackType = callbackType;</code>

<code>            </code><code>this</code><code>._code = code;</code>

<code>            </code><code>this</code><code>._data = data;</code>

<code>            </code><code>super</code><code>(eventType, bubbles, cancelable);</code>

<code>         </code><code>* 擷取回調事件類型,Constants 中定義了回調事件類型常量(CALLBACKTYE_*),遊戲應根據此回調事件類型對事件進行不同的處理。</code>

<code>         </code><code>* @return</code>

<code>         </code><code>*</code>

<code>        </code><code>public</code> <code>function</code> <code>get</code> <code>callbackType(): </code><code>String</code> <code>{</code>

<code>            </code><code>return</code> <code>_callbackType;</code>

<code>         </code><code>* 擷取回調事件狀态碼,表示SDK傳回的執行結果和狀态,StatusCode 中定義了回調事件狀态碼常量。不同回調事件類型的事件有自己對應的狀态清單,遊戲應根據此狀态碼進行不同的處理。</code>

<code>        </code><code>public</code> <code>function</code> <code>get</code> <code>code(): </code><code>int</code> <code>{</code>

<code>            </code><code>return</code> <code>_code;</code>

<code>         </code><code>* 擷取SDK傳回的執行結果資料,不同回調事件類型的事件具有不同的資料結構,遊戲應根據回調事件類型來擷取相應的資料。</code>

<code>        </code><code>public</code> <code>function</code> <code>get</code> <code>data(): </code><code>Object</code> <code>{</code>

<code>            </code><code>return</code> <code>_data;</code>

<code>        </code><code>}}</code>

3、定義常量

<code>    </code><code>public</code> <code>class</code> <code>Constants</code>

<code>        </code><code>public</code> <code>static</code> <code>const</code> <code>EVENT_TYPE_4399PAYSDK_CALLBACK = </code><code>"4399_pay_sdk_callback"</code><code>;</code>

<code>                                                                                                                                                                                                                                                                         </code> 

<code>        </code><code>public</code> <code>static</code> <code>const</code> <code>CB_LOGIN:</code><code>String</code> <code>= </code><code>"login"</code><code>;</code>

<code>        </code><code>public</code> <code>static</code> <code>const</code> <code>CB_LOGOUT:</code><code>String</code> <code>= </code><code>"logout"</code><code>;</code>

<code>        </code><code>public</code> <code>static</code> <code>const</code> <code>CB_CHARGE:</code><code>String</code> <code>= </code><code>"charge"</code><code>;</code>

<code>        </code><code>public</code> <code>static</code> <code>const</code> <code>STATUS_LOGIN_COMPLETE:</code><code>int</code> <code>= -</code><code>1</code><code>;</code><code>//登入完成</code>

<code>        </code><code>public</code> <code>static</code> <code>const</code> <code>STATUS_LOGIN_CANCEL:</code><code>int</code> <code>= -</code><code>2</code><code>; </code><code>//取消登入</code>

<code>        </code><code>public</code> <code>static</code> <code>const</code> <code>STATUS_LOGOUT_COMPLETE:</code><code>int</code> <code>= -</code><code>3</code><code>; </code><code>//取消登入</code>

<code>        </code><code>public</code> <code>static</code> <code>const</code> <code>STATUS_CHARGE_COMPLETE:</code><code>int</code> <code>= -</code><code>4</code><code>; </code><code>//充值完成</code>

<code>        </code><code>public</code> <code>static</code> <code>const</code> <code>STATUS_CHARGE_CANCEL:</code><code>int</code> <code>= -</code><code>5</code><code>; </code><code>//取消充值</code>

編譯在bin目錄下可以看到swc庫檔案。

3、生成ANE

  拷貝生成的本地jar檔案 與swc檔案到要建立ANE的目錄下

<a href="http://s3.51cto.com/wyfs02/M01/22/85/wKioL1MfzI_ji7T2AADbEQgvUJM369.jpg" target="_blank"></a>

這裡我們可以看到有個extension.xml,這個就是用于as3代碼裡面的的拓展辨別,用于as3調用jar包中的函數,裡面内容是

<code>&lt;</code><code>extension</code> <code>xmlns</code><code>=</code><code>"http://ns.adobe.com/air/extension/2.5"</code><code>&gt;</code>

<code>    </code><code>&lt;</code><code>id</code><code>&gt;com.sj4399.pay.ane.android&lt;/</code><code>id</code><code>&gt;</code>

<code>    </code><code>&lt;</code><code>versionNumber</code><code>&gt;1&lt;/</code><code>versionNumber</code><code>&gt;</code>

<code>    </code><code>&lt;</code><code>platforms</code><code>&gt;</code>

<code>        </code><code>&lt;</code><code>platform</code> <code>name</code><code>=</code><code>"Android-ARM"</code><code>&gt;</code>

<code>            </code><code>&lt;</code><code>applicationDeployment</code><code>&gt;</code>

<code>                </code><code>&lt;</code><code>nativeLibrary</code><code>&gt;4399PaySDKANEJava.jar&lt;/</code><code>nativeLibrary</code><code>&gt;</code>

<code>                </code><code>&lt;</code><code>initializer</code><code>&gt;com.sj4399.pay.ane.YJPaymentApiExtension&lt;/</code><code>initializer</code><code>&gt;</code>

<code>                </code><code>&lt;</code><code>finalizer</code><code>&gt;com.sj4399.pay.ane.YJPaymentApiExtension&lt;/</code><code>finalizer</code><code>&gt;</code>

<code>            </code><code>&lt;/</code><code>applicationDeployment</code><code>&gt;</code>

<code>        </code><code>&lt;/</code><code>platform</code><code>&gt;</code>

<code>    </code><code>&lt;/</code><code>platforms</code><code>&gt;</code>

<code>&lt;/</code><code>extension</code><code>&gt;</code>

signature.p12是air生成的密鑰,相信air遊戲開發者都清楚這個内容。

以解壓的方式打開SWC,解壓其中的library.swf到Android-ARM檔案夾中。

<a href="http://s3.51cto.com/wyfs02/M02/22/85/wKiom1MfzgTQpYkWAAHftNFQRW4246.jpg" target="_blank"></a>

将jar包和第三方所需要的res資源檔案拷貝到Android-ARM中,如圖

<a href="http://s3.51cto.com/wyfs02/M00/22/85/wKiom1MfzlOiDSo2AACD6pc1nJU317.jpg" target="_blank"></a>

這裡都做好了,接下來就是生成ANE了,我們編寫一個批處理檔案

<code>@REM 打包 .ane</code>

<code>SET SWC_FILE=4399PaySDK_ANE_AS.swc</code>

<code>SET ANE_FILE=4399PaySDK.ane</code>

<code>SET JAR_FILE=4399PaySDKANEJava.jar</code>

<code>SET FLEX_ADT_CMD=java -jar </code><code>"E:\softinstall\ADOBE\Adobe Flash Builder 4.7\sdks\4.6.0\lib\adt.jar"</code>

<code>%FLEX_ADT_CMD% -package -tsa none -storetype pkcs12 -keystore signature.p12 -storepass 123456 -target ane %ANE_FILE% extension.xml -swc %SWC_FILE% -platform Android-ARM -C Android-ARM .</code>

<code>pause</code>

好了,這樣就可以生成我們的所需要的ANE了.至于如何調用相信大家都知道,這裡就不多說了。

本文轉自xuzw13 51CTO部落格,原文連結:http://blog.51cto.com/xuzhiwei/1373830,如需轉載請自行聯系原作者

繼續閱讀