2013-06-10 6 views
5

Android NDK를 사용하는 Java 앱에서 사용할 공유 라이브러리를 구축 중입니다. readelf을 사용하여 릴리스 빌드에 의해 생성 된 lib/armeabi-v7a/libXXXlib.so 파일을 검사하면 내 원시 C/C++ 코드의 모든 기호 (함수, 변수 이름)가 포함 된 것처럼 보입니다.Android NDK로 작성된 공유 라이브러리에서 심볼을 제거 할 수 있습니까?

사실 공유 객체 파일은 디버그 빌드와 릴리스 빌드에서 동일합니다. (libs 폴더의 출력 차이는 gsb.setupgdbserver 파일이 생성되었는지 여부입니다.) Application.mkAPP_CFLAGS += -O3 인 NDK로 설정된 최적화를 무시하고 있지만 릴리스 빌드를 기대하지는 않습니다. 디버그 심볼을 생성하려면 -g 플래그를 포함시켜 디버그 심볼을 생성합니다.

나는 SO 'In both cases, debug and release, it leaves the -g flag in because, to quote the comment, "we generate symbol versions of the binaries that are later stripped when they are copied to the final project's libs/ directory"'을 진술하고, 다른 진술에 댓글 발견 : 그 결국 libs에서 만든 것보다 훨씬 더 큰 같이 확실히의 obj/armeabi-v7a/libXXXlib.so 파일에서 뭔가을 제거한다 'JNI cannot find the functions for java if they don't have names.'

ndk-build을하지만, 여전히 내 모든 함수와 변수 이름을 그대로 파일에 남겨두고있는 것처럼 보입니다.

모두 네이티브 코드의 엔트리 포인트가 아니라 JNI에서 필자의 함수 이름이 필요합니까?

그렇지 않은 경우 어떻게 필요하지 않은 기호를 제거 할 수 있습니까? 당신이, 당신 돈 JNI 방법의 명시적인 등록을 사용하는 경우

답변

6

, 당신은

+3

또한 Windows에서 (비슷한 DLLEXPORT에) 수출하는 데 필요한 몇 가지 기능에 대한 기본 가시성 = 숨김 및 설정 속성의 가시성 = 기본 설정 자유롭게 심지어 사람들이 눈에 띄도록해야합니다. http://developer.android.com/training/articles/perf-jni.html#native_libraries를 참조하십시오. – fadden

+2

Thanks @ alex-cohn, @fadden. 내'Android.mk'에있는'LOCAL_CFLAGS'에'-fvisibility = hidden'을 추가했고, 내보내는 JNI 엔트리 포인트에서 모든 심볼을 제거했습니다. (그래서 JNI_OnLoad에서 JNI 메소드의 명시 적 등록을 설정하지 않았다.) 당신은 그 함수들에 대한 가시성을 무엇이 설정하는지 알고 있는가? – Rich

+0

또한 ndk-build의 릴리스 빌드에 기본적으로 설정되지 않은 이유를 알고 계십니까? – Rich