2015-06-01 38 views
0

我有java應用程序,我在其中使用C++代碼。所有的C++代碼都被編譯爲.so文件。 我必須爲項目的本地部分編寫單元測試。 我寫了這樣的單元測試:運行可執行文件時出現段錯誤android ndk模塊

#include <gtest/gtest.h> 
#include <gtest-all.cc> 
#include <myTestedFile.h> 
#include <jni.h> 
#include <iostream>  

int main(int argc, char** argv) 
{ 
    ::testing::InitGoogleTest(&argc, argv); 
    RUN_ALL_TESTS(); 
    return 0; 
} 

TEST(MyTest, Test1) 
{ 
    jclass jc; 
    int k = jni_return_five((JNIEnv*)0, jc); 
    ASSERT_EQ(k,5); 
} 

有文件myTestedFile.cpp

#include "myTestedFile.h" 

JNIEXPORT jint JNICALL jni_return_five(JNIEnv *env, jclass cls) 
{ 
     jclass commonClass = env->FindClass(
"com/android/appportal/common/Myclass"); 
    return 5; 
} 

我開始這個測試用這樣的方式

adb push libs/armeabi-v7a/myTest /data/local/tmp 
adb push libs/armeabi-v7a/myLibrary.so /data/local/tmp 
adb shel "LD_LIBRARY_PATH=/data/local/tmp data/local/tmp/myTest" 

在此之後我有輸出

[==========] Running 1 test from 1 test case. 
[----------] Global test environment set-up. 
[----------] 1 test from MyTest 
[ RUN  ] MyTest.Test1 
Segmentation fault 

T如果我沒有在jni代碼中獲得對java類的引用,est會成功傳遞。任何人都可以幫我解決這個錯誤嗎?

有崩潰

F/libc (10105): Fatal signal 11 (SIGSEGV) at 0x00000000 (code=1), thread 10105 (myLibrary) 
I/DEBUG ( 113): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** 
I/DEBUG ( 113): Build fingerprint: 'samsung/espresso10rfxx/espresso10rf:4.0.3/IML74K/P5100XWALE2:user/release-keys' 
I/DEBUG ( 113): Revision: '10' 
I/DEBUG ( 113): pid: 10105, tid: 10105, name: myLibrary >>> /data/local/tmp/myTest <<< 
I/DEBUG ( 113): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 00000000 
W/NativeCrashListener( 399): Couldn't find ProcessRecord for pid 10105 

I/DEBUG ( 113):   be8268c8 004e1de8 [heap] 
I/DEBUG ( 113):   be8268cc be826a6c [stack] 
I/DEBUG ( 113):   be8268d0 00000001 
I/DEBUG ( 113):   be8268d4 4021fdb4 /data/local/tmp/libgnustl_shared.so (operator new[](unsigned int)+8) 
I/DEBUG ( 113):   be8268d8 004e2610 [heap] 
I/DEBUG ( 113):   be8268dc 0000bc70 /data/local/tmp/myTest 
I/DEBUG ( 113):   be8268e0 402a22f0 /system/lib/libc.so 
I/DEBUG ( 113):   be8268e4 004e1e44 [heap] 
I/DEBUG ( 113):   be8268e8 00039df8 /data/local/tmp/myTest 
I/DEBUG ( 113):   be8268ec be826918 [stack] 
I/DEBUG ( 113):   be8268f0 00000000 
I/DEBUG ( 113):   be8268f4 be82690c [stack] 
I/DEBUG ( 113):   be8268f8 e3a070ad 
I/DEBUG ( 113):   be8268fc ef9000ad 
I/DEBUG ( 113):  #00 be826900 000384c4 /data/local/tmp/myTest 
I/DEBUG ( 113):   be826904 00000000 
I/DEBUG ( 113):   be826908 be826924 [stack] 
I/DEBUG ( 113):   be82690c 0002d9b4 /data/local/tmp/myTest 
I/DEBUG ( 113):  #01 be826910 004e1ee0 [heap] 
I/DEBUG ( 113):   be826914 00000000 
I/DEBUG ( 113):   be826918 00000000 
I/DEBUG ( 113):   be82691c 00000000 
I/DEBUG ( 113):   be826920 be82695c [stack] 
I/DEBUG ( 113):   be826924 0001df80 /data/local/tmp/myTest 
I/DEBUG ( 113):  #02 be826928 be826944 [stack] 
I/DEBUG ( 113):   be82692c 0001f040 /data/local/tmp/myTest 
I/DEBUG ( 113):   be826930 000105cc /data/local/tmp/myTest 
I/DEBUG ( 113):   be826934 004e2548 [heap] 
I/DEBUG ( 113):   be826938 004e1ee0 [heap] 
I/DEBUG ( 113):   be82693c 00039df8 /data/local/tmp/myTest 
I/DEBUG ( 113):   be826940 be826954 [stack] 
I/DEBUG ( 113):   be826944 00010620 /data/local/tmp/myTest 
I/DEBUG ( 113):   be826948 be826954 [stack] 
I/DEBUG ( 113):   be82694c 004e1ee0 [heap] 
I/DEBUG ( 113):   be826950 be82695c [stack] 
I/DEBUG ( 113):   be826954 004e2568 [heap] 
I/DEBUG ( 113):   be826958 be826974 [stack] 
I/DEBUG ( 113):   be82695c 00010e30 /data/local/tmp/myTest 
I/DEBUG ( 113):   be826960 be82696c [stack] 
I/DEBUG ( 113):   be826964 004e2548 [heap] 
+0

崩潰的'logcat'會提供一些額外的信息。 – MuertoExcobito

+0

@MuertoExcobito 我將logcat添加到問題 –

+0

logcat還應包含崩潰的調用堆棧。 – MuertoExcobito

回答

0

的logcat的我解決了這個問題,爲的JNIEnv類包裝的創造。

相關問題