在JS代碼中使用反射調用java代碼注意事項(附webview使用方法)(轉)


轉自http://cn.cocos2d-x.org/tutorial/show?id=2279

本文是推薦使用過jsb.reflection的開發者進行閱讀。關於jsb.reflection的說明請參照:

我們在代碼編寫過程中,通常會需要在js腳本中調用到java代碼或者Objective-C的代碼。例如:接入sdk,顯示webview,使用原生代碼,接入廣告等等。

 

現在以在js腳本在Android中使用webview為例。

 

首先在js腳本中加入如下代碼。調用java端的webview

var webUrl = "http://www.baidu.com";
if(cc.sys.os == cc.sys.OS_ANDROID){
              this.addKeyListener();
              this.webViewId = jsb.reflection.callStaticMethod("org/cocos2dx/lib/Cocos2dxWebViewHelper", "createWebView", "()I");
              if(this.webViewId < 0) return ;
              jsb.reflection.callStaticMethod("org/cocos2dx/lib/Cocos2dxWebViewHelper", "setScalesPageToFit", "(IZ)V", this.webViewId, true);
              jsb.reflection.callStaticMethod("org/cocos2dx/lib/Cocos2dxWebViewHelper", "loadUrl", "(ILjava/lang/String;)V", this.webViewId, webUrl);
         }

這段代碼執行以后,會在界面上生成一個webview,顯示百度的主頁。

 

但是實際情況是,我們在編譯Android版本運行以后發現。在顯示完百度主頁以后,程序就崩潰了。

 

查看后台后發現后台提示了這兩個問題。

59_362141_e972f457e22341b.jpg

 

59_362141_322e975aa1f36c8.jpg

 

看上面的提示,標識的是c++端,沒有實現Java_org_cocos2dx_lib_Cocos2dxWebViewHelper_didFinishLoading 函數, 但是實際上。我們會發現,這段代碼實際上已經在cocos2d-x/cocos/ui/UIWebViewImpl-android.cpp中實現了。並且已經編譯進去了。

 

這是為什么呢?

答案其實是, 我們在Cocos2d-JS 3.2版本的時候,做過的安裝包體積自動縮減功能在作怪。

我們在安裝包體積縮減的時候采用了 LOCAL_STATIC_LIBRARIES 的方式鏈接c++各個庫文件。這種鏈接方式會在在連接靜態連接庫的時候移除"daed code",何謂dead code呢,就是調用者模塊永遠都不會用到的代碼段和變量。

由於我們是在js腳本中引用的webview對象,而在c++代碼中並沒有使用webview對象,這就導致了,c++在生成so鏈接庫的時候,將webview這部分代碼給移除了。

 

解決方案:

只需要在我們的c++代碼中顯示調用以下即可。

在appDelegate.cpp中引入頭文件,引入

  #include  "ui/UIWebView.h"

在函數 applicationDidFinishLaunching最后,加上

  #if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
       cocos2d::experimental::ui::WebView::create();
  #endif

即可。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM