2
나는 또한 내가 만든 라이브러리를로드하는 C++ 주요 응용 프로그램을 만들었습니다. 두 원본 모두 공통 헤더 (TestFlags.h)를 공유합니다. TestFlags.h 안에 클래스와 포인터 선언은 메인 애플리케이션의 인스턴스를 정의하고 라이브러리 함수 내에서 사용하는 전체 애플리케이션에 대해 전역 적으로 사용하도록되어 있습니다. dlopen on Android ndk
class TestFlags {
public:
TestFlags() : behaviour(1)
{}
int behaviour;
};
extern __attribute__ ((visibility("default"))) TestFlags * gpTestFlags;
다음 실행 단계의 시퀀스가 지정된 목표를 달성하기 위해 다음과 같습니다
- 메인 애플리케이션 TestFlags ---> gpTestFlags = 새로운 TestFlags의 새로운 인스턴스를 생성한다();
- 메인 프로그램 라이브러리 ---> dlopen을 (library.so, RTLD_LAZY | RTLD_GLOBAL)로드
- 이전의 예를 사용하여 라이브러리 안에있는 함수를 호출 선언 ---> gpTestFlags-> 동작 = 2; gpTestFlags 라이브러리 gpTestFlags 인스턴스 내부에 어떤 이유로 보이지 않는 것 같다
NULL 때문에 분할 오류 :
내가 연구 할 수있는 한, 라이브러리는 복제 된 것처럼 선언문에 완전히 다른 메모리 공간을 관리하는 것으로 보인다.
불행히도 코드는 크로스 플랫폼을위한 것입니다. Windows에서 정확히 LoadLibrary 및 __attribute __ ((visibily ("default"))와 __declspec (dllimport/dllimport)을 사용하여 dlopen을 변경하면됩니까 – walter
내가 언급 한 또 다른 사항은 Android 용 dlopen 소스 코드를 살펴 보는 것입니다 flag 매개 변수를 무시합니다. – walter