<ruby id="h6500"><table id="h6500"></table></ruby>
    1. <ruby id="h6500"><video id="h6500"></video></ruby>
          1. <progress id="h6500"><u id="h6500"><form id="h6500"></form></u></progress>
            • 軟件測試技術(shù)
            • 軟件測試博客
            • 軟件測試視頻
            • 開(kāi)源軟件測試技術(shù)
            • 軟件測試論壇
            • 軟件測試沙龍
            • 軟件測試資料下載
            • 軟件測試雜志
            • 軟件測試人才招聘
              暫時(shí)沒(méi)有公告

            字號: | 推薦給好友 上一篇 | 下一篇

            教你如何在軟件測試中搞定JNI的crash

            發(fā)布: 2010-8-27 09:22 | 作者: 網(wǎng)絡(luò )轉載 | 來(lái)源: 領(lǐng)測軟件測試網(wǎng)采編 | 查看: 64次 | 進(jìn)入軟件測試論壇討論

            領(lǐng)測軟件測試網(wǎng)

            MILY: Arial, Helvetica, sans-serif">教你如何在軟件測試中搞定JNI的crash

            今天可算是終于搞定困擾我一周的一個(gè)問(wèn)題了。

            我們的算法通過(guò)jni封裝,在java
            調用的時(shí)候總是隨機的crash掉,具體的位置在jvm里面,應該可以肯定是jvm做垃圾回收的時(shí)候死掉的。但是并不知道是在回收哪塊內存出的問(wèn)題,所以也就無(wú)從知道死的具體原因了。我們的程序是在jni層創(chuàng )建了一些java對象,然后返回給java層,大體結構像下面代碼一樣,我只能基本判斷是我們的jni層在創(chuàng )建對象的時(shí)候(也就是createInfo函數)出問(wèn)題了,至于具體什么問(wèn)題,我也不清楚。
            public class Test {
                public class Info {
                    public int x;
                    public int y;
                    public Info() {
                        x = 0;
                        y = 0;
                    }
                }
                
                public native Info createInfo();
               
                // ...
            }

            因為我對java不是很熟悉,所以只好一邊學(xué),一邊弄。最初就是在local/glbal reference這些概念上下功夫,來(lái)回的讀jni的specification,也沒(méi)有發(fā)現自己的問(wèn)題。后期又學(xué)著(zhù)使用一些java的調試工具,比如jhat啊,hpjmeter啊,但是仍然沒(méi)有什么頭緒。上周一周,就在這個(gè)問(wèn)題上不斷的嘗試,也沒(méi)結果。

            今天終于發(fā)現了問(wèn)題所在,其實(shí)說(shuō)來(lái)也很簡(jiǎn)單。jni要創(chuàng )建的那些返回對象,是作為內部類(lèi)定義的,所以在構造的時(shí)候需要傳一個(gè)外層類(lèi)實(shí)例才能初始化。也就是說(shuō),雖然看上去Info類(lèi)的構造函數是無(wú)參數的,但實(shí)際上它是有一個(gè)隱含參數的,相當于Info(Test outer)。如果在java層構造這個(gè)對象,那么outer參數會(huì )被自動(dòng)傳入,但我們在jni層構造,就需要自己傳入這個(gè)參數了。如果沒(méi)有給出這個(gè)參數,jni編譯運行都沒(méi)有問(wèn)題,但實(shí)際上,它是用了一個(gè)未知的對象(就是在棧里面的一個(gè)隨機值)來(lái)作為這個(gè)outer參數的,所以當這個(gè)對象需要釋放的時(shí)候(一般也就是在垃圾回收的時(shí)候)就會(huì )crash了。

            現在想起來(lái),其實(shí)這個(gè)問(wèn)題我原來(lái)曾經(jīng)有過(guò)一次小遭遇,那時(shí)我在使用有參數構造函數來(lái)創(chuàng )建一個(gè)內部嵌套類(lèi),發(fā)現構造出來(lái)的對象值是錯掉的。其實(shí)就是因為少傳了一個(gè)outer參數啊,但是當時(shí)我沒(méi)有去解決這個(gè)問(wèn)題,而是繞過(guò)問(wèn)題,采用構造函數無(wú)參數,然后在創(chuàng )建之后,再手工給每個(gè)數據字段賦值的方法。這樣雖然表面上也達到了目的,但是隱藏了問(wèn)題。

            事實(shí)一次次的告訴我們,遇到問(wèn)題一定要解決。就算你暫時(shí)繞過(guò)這個(gè)問(wèn)題,但早晚它還會(huì )出來(lái)的。

            延伸閱讀

            文章來(lái)源于領(lǐng)測軟件測試網(wǎng) http://kjueaiud.com/

            TAG: JNI 軟件測試 crash


            關(guān)于領(lǐng)測軟件測試網(wǎng) | 領(lǐng)測軟件測試網(wǎng)合作伙伴 | 廣告服務(wù) | 投稿指南 | 聯(lián)系我們 | 網(wǎng)站地圖 | 友情鏈接
            版權所有(C) 2003-2010 TestAge(領(lǐng)測軟件測試網(wǎng))|領(lǐng)測國際科技(北京)有限公司|軟件測試工程師培訓網(wǎng) All Rights Reserved
            北京市海淀區中關(guān)村南大街9號北京理工科技大廈1402室 京ICP備2023014753號-2
            技術(shù)支持和業(yè)務(wù)聯(lián)系:info@testage.com.cn 電話(huà):010-51297073

            軟件測試 | 領(lǐng)測國際ISTQBISTQB官網(wǎng)TMMiTMMi認證國際軟件測試工程師認證領(lǐng)測軟件測試網(wǎng)

            老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月
              <ruby id="h6500"><table id="h6500"></table></ruby>
              1. <ruby id="h6500"><video id="h6500"></video></ruby>
                    1. <progress id="h6500"><u id="h6500"><form id="h6500"></form></u></progress>