在Android上使用動態加載API(<dlfcn.h>
:dlopen()
,dlclose()
等)時出現問題。 我正在使用NDK獨立工具鏈(版本8)來編譯應用程序和庫。 Android版本是2.2.1 Froyo。在Android平臺上使用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;
}
有了這些來源的一切工作正常,但當我嘗試使用一些STL函數或類,程序崩潰與分段故障,則main()
函數退出,例如,當使用這個時共享庫的源代碼。
#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()
功能出口與後段故障或崩潰。 我已經嘗試了幾個測試,發現以下結果。
- 沒有使用STL,一切工作正常。
- 當使用STL並且最後不要調用
dlclose()
時,一切工作正常。 - 我試圖編譯各種編譯標誌,如
-fno-use-cxa-atexit
或-fuse-cxa-atexit
,結果是一樣的。
我的代碼使用STL時出了什麼問題?
+1格式良好的問題;) –
STL標頭是否在標頭的文件中?你可以把它只是對cpp文件? (所以STL不會在接口中。)定義和聲明是分開的嗎? – Naszta
我想你是在談論aaa(...)函數,如果是,那麼聲明和定義是在不同的文件。定義頭文件是'#ifdef __cplusplus extern「C」 #endif int aaa(int i);' –