1

我有两个共享库:lib1 和 lib2。lib1 预编译到 lib2。

我在 lib1 中有类:

#include <android/log.h>

#include "stdlib.h"
#include <string>

class Foo
{
public:
    Foo()
    {
        __android_log_print(ANDROID_LOG_VERBOSE, "Two Libs", "Foo::Foo()"); 
    }

    ~Foo();

private:
    std::string str;
};

.cpp 文件中定义的析构函数。

#include "first.h"

Foo::~Foo()
{
    __android_log_print(ANDROID_LOG_VERBOSE, "Two Libs", "Foo::~Foo()");    
}

比我在 lib2 中使用这个类:

#include <string.h>
#include <jni.h>
#include <android/log.h>

#include "first.h"

extern "C" 
{

JNIEXPORT void JNICALL Java_com_example_twolibs_TwoLibs_nativeMethod( JNIEnv* env )
{
    __android_log_print(ANDROID_LOG_VERBOSE, "Two Libs", "Test std::string bug 1");

    Foo* newFoo = new Foo();

    __android_log_print(ANDROID_LOG_VERBOSE, "Two Libs", "Test std::string bug 2");

    delete newFoo;

    __android_log_print(ANDROID_LOG_VERBOSE, "Two Libs", "Test std::string bug 3"); 

    return;
}

}

日志:

09-09 12:48:14.089: V/Two Libs(13512): Test std::string bug 1
09-09 12:48:14.089: V/Two Libs(13512): Foo::Foo()
09-09 12:48:14.089: V/Two Libs(13512): Test std::string bug 2
09-09 12:48:14.089: V/Two Libs(13512): Foo::~Foo()

如果我删除 std::string - 不会发生崩溃。所以问题看起来像 std::string 析构函数。

如果我在 lib2 中定义类或仅在 lib1 中使用它 - 不会发生崩溃

如果我只在标题中定义析构函数 - 不会发生崩溃

我使用 ndk-r8b。水晶 r7 上的同样问题。通过 CygWin 在 Windows 上构建。

崩溃日志:

09-09 12:48:14.199: I/DEBUG(10548): Build fingerprint: 'samsung/GT-S5660/GT-S5660:2.3.3/GINGERBREAD/XXKPK:user/release-keys'
09-09 12:48:14.199: I/DEBUG(10548): pid: 13512, tid: 13512  >>> com.example.twolibs <<<
09-09 12:48:14.199: I/DEBUG(10548): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr deadbaad
09-09 12:48:14.209: I/DEBUG(10548):  r0 deadbaad  r1 0000000c  r2 00000027  r3 00000000
09-09 12:48:14.209: I/DEBUG(10548):  r4 00000080  r5 afd46688  r6 0000a000  r7 4428fce8
09-09 12:48:14.209: I/DEBUG(10548):  r8 beb75470  r9 4428fce0  10 4428fcc8  fp 44ff5970
09-09 12:48:14.209: I/DEBUG(10548):  ip ffffffff  sp beb753e0  lr afd19385  pc afd15f00  cpsr 00000030
09-09 12:48:14.209: I/DEBUG(10548):  d0  3f8000003f800000  d1  3ff0000040000000
09-09 12:48:14.209: I/DEBUG(10548):  d2  bfd3441350baf6de  d3  c1493000c1323800
09-09 12:48:14.209: I/DEBUG(10548):  d4  4900000040dcb000  d5  000000000006e580
09-09 12:48:14.209: I/DEBUG(10548):  d6  4515a00000000800  d7  40800000c48ee000
09-09 12:48:14.219: I/DEBUG(10548):  d8  0000000000000000  d9  0000000000000000
09-09 12:48:14.219: I/DEBUG(10548):  d10 0000000000000000  d11 0000000000000000
09-09 12:48:14.219: I/DEBUG(10548):  d12 0000000000000000  d13 0000000000000000
09-09 12:48:14.219: I/DEBUG(10548):  d14 0000000000000000  d15 0000000000000000
09-09 12:48:14.219: I/DEBUG(10548):  scr 60000012
09-09 12:48:14.279: I/DEBUG(10548):          #00  pc 00015f00  /system/lib/libc.so
09-09 12:48:14.279: I/DEBUG(10548):          #01  pc 00013862  /system/lib/libc.so
09-09 12:48:14.279: I/DEBUG(10548): code around pc:
09-09 12:48:14.279: I/DEBUG(10548): afd15ee0 68241c23 d1fb2c00 68dae027 d0042a00 
09-09 12:48:14.279: I/DEBUG(10548): afd15ef0 20014d18 6028447d 48174790 24802227 
09-09 12:48:14.279: I/DEBUG(10548): afd15f00 f7f57002 2106eb56 ec92f7f6 0563aa01 
09-09 12:48:14.279: I/DEBUG(10548): afd15f10 60932100 91016051 1c112006 e818f7f6 
09-09 12:48:14.279: I/DEBUG(10548): afd15f20 2200a905 f7f62002 f7f5e824 2106eb42 
09-09 12:48:14.279: I/DEBUG(10548): code around lr:
09-09 12:48:14.279: I/DEBUG(10548): afd19364 b0834a0d 589c447b 26009001 686768a5 
09-09 12:48:14.279: I/DEBUG(10548): afd19374 220ce008 2b005eab 1c28d003 47889901 
09-09 12:48:14.279: I/DEBUG(10548): afd19384 35544306 d5f43f01 2c006824 b003d1ee 
09-09 12:48:14.279: I/DEBUG(10548): afd19394 bdf01c30 000281b8 ffffff88 1c0fb5f0 
09-09 12:48:14.279: I/DEBUG(10548): afd193a4 43551c3d a904b087 1c16ac01 604d9004 
09-09 12:48:14.279: I/DEBUG(10548): stack:
09-09 12:48:14.279: I/DEBUG(10548):     beb753a0  00000015  
09-09 12:48:14.279: I/DEBUG(10548):     beb753a4  afd18417  /system/lib/libc.so
09-09 12:48:14.279: I/DEBUG(10548):     beb753a8  afd4272c  
09-09 12:48:14.279: I/DEBUG(10548):     beb753ac  afd426d8  
09-09 12:48:14.279: I/DEBUG(10548):     beb753b0  00000000  
09-09 12:48:14.279: I/DEBUG(10548):     beb753b4  afd19385  /system/lib/libc.so
09-09 12:48:14.279: I/DEBUG(10548):     beb753b8  802182c0  /system/lib/libdvm.so
09-09 12:48:14.279: I/DEBUG(10548):     beb753bc  afd183e9  /system/lib/libc.so
09-09 12:48:14.279: I/DEBUG(10548):     beb753c0  4428fc50  
09-09 12:48:14.279: I/DEBUG(10548):     beb753c4  00000000  
09-09 12:48:14.279: I/DEBUG(10548):     beb753c8  afd46688  
09-09 12:48:14.279: I/DEBUG(10548):     beb753cc  0000a000  
09-09 12:48:14.279: I/DEBUG(10548):     beb753d0  4428fce8  
09-09 12:48:14.279: I/DEBUG(10548):     beb753d4  afd18687  /system/lib/libc.so
09-09 12:48:14.279: I/DEBUG(10548):     beb753d8  df002777  
09-09 12:48:14.279: I/DEBUG(10548):     beb753dc  e3a070ad  
09-09 12:48:14.279: I/DEBUG(10548): #00 beb753e0  ffffffff  
09-09 12:48:14.279: I/DEBUG(10548):     beb753e4  7fffffd2  
09-09 12:48:14.279: I/DEBUG(10548):     beb753e8  afd46628  
09-09 12:48:14.279: I/DEBUG(10548):     beb753ec  afd11020  /system/lib/libc.so
09-09 12:48:14.279: I/DEBUG(10548):     beb753f0  80d1cf00  
09-09 12:48:14.279: I/DEBUG(10548):     beb753f4  fffffbdf  
09-09 12:48:14.279: I/DEBUG(10548):     beb753f8  000000da  
09-09 12:48:14.279: I/DEBUG(10548):     beb753fc  afd46470  
09-09 12:48:14.279: I/DEBUG(10548):     beb75400  000001b4  
09-09 12:48:14.279: I/DEBUG(10548):     beb75404  afd13867  /system/lib/libc.so
09-09 12:48:14.279: I/DEBUG(10548): #01 beb75408  afd46470  
09-09 12:48:14.279: I/DEBUG(10548):     beb7540c  afd13867  /system/lib/libc.so
09-09 12:48:14.279: I/DEBUG(10548):     beb75410  802182c0  /system/lib/libdvm.so
09-09 12:48:14.279: I/DEBUG(10548):     beb75414  0000cec8  
09-09 12:48:14.279: I/DEBUG(10548):     beb75418  00000000  
09-09 12:48:14.279: I/DEBUG(10548):     beb7541c  903884f9  
09-09 12:48:14.279: I/DEBUG(10548):     beb75420  000000da  
09-09 12:48:14.279: I/DEBUG(10548):     beb75424  80c1ce44  
09-09 12:48:14.289: I/DEBUG(10548):     beb75428  000f1200  
09-09 12:48:14.289: I/DEBUG(10548):     beb7542c  80d1cf00  
09-09 12:48:14.289: I/DEBUG(10548):     beb75430  4428fce8  
09-09 12:48:14.289: I/DEBUG(10548):     beb75434  afd14779  /system/lib/libc.so
09-09 12:48:14.289: I/DEBUG(10548):     beb75438  80c1ce44  
09-09 12:48:14.289: I/DEBUG(10548):     beb7543c  80c08097  /mnt/asec/com.example.twolibs-1/lib/libfirst.so
09-09 12:48:14.289: I/DEBUG(10548):     beb75440  00000000  
09-09 12:48:14.289: I/DEBUG(10548):     beb75444  460247e3  
09-09 12:48:14.289: I/DEBUG(10548):     beb75448  000f1200  
09-09 12:48:14.289: I/DEBUG(10548):     beb7544c  00000000  

如果它在这个论坛上被分配,我可以附上示例项目。

4

1 回答 1

0

我在 cygwin 上使用 NDK-r8b 进行了尝试,效果很好,外观上的变化很小。APP_STL=gnustl_static它可以在带有orgnustl_sharedstlport_staticor的 Andorid 2.2 上正常工作stlport_shared。请注意,您需要插入System.loadLibrary("gnustl_shared")System.loadLibrary("stlport_shared")放入TwoLibs.java文件中。

于 2012-09-09T13:24:59.643 回答