2013-06-10 27 views
5

Tôi đang xây dựng một thư viện được chia sẻ để sử dụng trong một ứng dụng Java bằng cách sử dụng NDK của Android. Sử dụng readelf để kiểm tra tệp lib/armeabi-v7a/libXXXlib.so được tạo bởi bản dựng phát hành, nó dường như chứa tất cả các ký hiệu (hàm, tên biến) của mã C/C++ gốc của tôi.Có thể xóa biểu tượng khỏi thư viện được chia sẻ được tạo bằng NDK của Android không?

Thật vậy, tệp đối tượng được chia sẻ dường như giống hệt nhau cho bản dựng gỡ lỗi và bản phát hành. (Sự khác biệt duy nhất trong đầu ra trong thư mục libs là có hay không các tệp gsb.setupgdbserver được tạo.) Tôi ghi đè bộ tối ưu hóa của NDK bằng APP_CFLAGS += -O3 trong số Application.mk của mình, nhưng tôi không mong đợi bản phát hành bản phát hành để tạo các biểu tượng gỡ lỗi bằng cách đưa cờ -g vào.

Tôi tìm thấy một bình luận trên SO nêu '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"', và một trong đó nêu: 'JNI cannot find the functions for java if they don't have names.'

ndk-build được chắc chắn tước một cái gì đó từ tập tin obj/armeabi-v7a/libXXXlib.so, vì đó là lớn hơn nhiều so với cái cuối cùng được tạo ra trong libs, nhưng nó vẫn dường như để lại tất cả các chức năng của tôi 'và biến' tên còn nguyên vẹn trong tập tin.

Có phải tất cả tên chức năng của tôi được yêu cầu bởi JNI (thay vì chỉ nhập điểm vào mã gốc)?

Nếu không, làm cách nào tôi có thể xóa các biểu tượng không bắt buộc?

Trả lời

6

Hãy thoải mái để thiết lập tầm nhìn mặc định = ẩn, và thiết lập tầm nhìn thuộc tính = mặc định cho số ít các chức năng bạn cần để xuất khẩu (tương tự như dllexport) trong Windows

+3

Ngoài ra, nếu bạn sử dụng đăng ký rõ ràng của phương pháp JNI, bạn don thậm chí không cần những thứ đó để được nhìn thấy. Xem http://developer.android.com/training/articles/perf-jni.html#native_libraries. – fadden

+2

Cảm ơn @ alex-cohn, @fadden. Tôi đã thêm '-fvisibility = hidden' vào' LOCAL_CFLAGS' trong 'Android.mk' của tôi và nó xóa tất cả các ký hiệu * tách biệt * khỏi các điểm nhập JNI mà tôi đang xuất. (Vì vậy, tôi đã không thiết lập đăng ký rõ ràng của các phương pháp JNI trong JNI_OnLoad.) Bạn có biết những gì thiết lập khả năng hiển thị trên các chức năng? – Rich

+0

Ngoài ra, bạn có biết tại sao điều này không được đặt theo mặc định cho các bản phát hành do ndk-build xây dựng không? – Rich

Các vấn đề liên quan