运行可执行android NDK模块时出现分段故障

segmentation fault while running executable android ndk module

本文关键字:分段 故障 模块 可执行 android NDK 运行      更新时间:2023-10-16

我有java应用程序,其中我使用c++代码。所有c++代码都被编译成。so文件。我必须为项目的本机部分编写单元测试。我写了这样的单元测试:

#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);
}

有mytestdfile .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 

测试通过成功,如果我没有得到引用java类在jni代码。有人能帮我解决这个错误吗?

有崩溃日志

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]

我通过为JNIEnv类创建包装器来解决这个问题。