AndroidでダイナミックローディングAPI(<dlfcn.h>
:dlopen()
、dlclose()
など)を使用する際にいくつか問題があります。 NDKスタンドアロンツールチェーン(バージョン8)を使用して、アプリケーションとライブラリをコンパイルしています。 Androidのバージョンは2.2.1 Froyoです。アンドロイドプラットフォームでdlclose(...)を使用した場合のセグメント化エラー
シンプルな共有ライブラリのソースコードです。
#include <stdio.h>
int iii = 0;
int *ptr = NULL;
__attribute__((constructor))
static void init()
{
iii = 653;
}
__attribute__((destructor))
static void cleanup()
{
}
int aaa(int i)
{
printf("aaa %d\n", iii);
}
上記のライブラリを使用するプログラムソースコードを示します。
#include <dlfcn.h>
#include <stdlib.h>
#include <stdio.h>
int main()
{
void *handle;
typedef int (*func)(int);
func bbb;
printf("start...\n");
handle = dlopen("/data/testt/test.so", RTLD_LAZY);
if (!handle)
{
return 0;
}
bbb = (func)dlsym(handle, "aaa");
if (bbb == NULL)
{
return 0;
}
bbb(1);
dlclose(handle);
printf("exit...\n");
return 0;
}
すべてが正常に動作しているこれらのソースで
が、私はmain()
関数が終了、例えばこれを使用してセグメンテーションフォールト、といくつかのSTL関数やクラス、プログラムがクラッシュを使用しようとすると、共有ライブラリのソースコード。このコードでは
#include <iostream>
using namespace std;
int iii = 0;
int *ptr = NULL;
__attribute__((constructor))
static void init()
{
iii = 653;
}
__attribute__((destructor))
static void cleanup()
{
}
int aaa(int i)
{
cout << iii << endl;
}
、プログラムは、後にセグメンテーションフォールトでクラッシュしたりmain()
関数exit中。 私はいくつかのテストを試した結果、次の結果が見つかりました。
- STLを使用しないとすべて正常に動作しています。
- STLを使用していて、最後に
dlclose()
を呼び出さないと、すべて正常に動作しています。 -fno-use-cxa-atexit
や-fuse-cxa-atexit
のようなさまざまなコンパイルフラグでコンパイルしようとしましたが、結果は同じです。
STLを使用する私のコードで何が間違っていますか?
あなたは(AAA機能宣言するのextern「C」を使用する必要があります
+1いいえフォーマット済み質問;) –
soヘッダーのSTLヘッダーはファイルですか?あなたはそれをcppファイルに取ってもらえますか? (したがって、STLはインターフェイスにはありません)。定義と宣言は分かれていますか? – Naszta
私はあなたがaaa(...)関数について話していると思います。もしそうなら、宣言と定義は異なるファイルにあります。定義ヘッダーファイルは '#ifdef __cplusplus extern" C " #endif int aaa(int i);' –