2015-06-01 37 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类包装的创造。

相关问题