2012-06-19 35 views
6

Tôi cần làm việc với các nội dung trong thư mục nội dung của mình từ bên trong mã C/C++. Có an toàn để lưu vào bộ nhớ cache con trỏ tới AAssetManager như thế này không: ...Android NDK - sử dụng AssetManager trong mã gốc

AAssetManager* assetMgr = NULL; 

void Java_com_example_createAssetManager(JNIEnv* env, jclass clazz, jobject assetManager) 
{ 
    AAssetManager* mgr = AAssetManager_fromJava(env, assetManager); 
    assert(NULL != mgr); 
    assetMgr = mgr;  
} 

... và sau đó sử dụng nó bất cứ khi nào tôi cần? Hàm createAssetManager được gọi từ phương thức Java onCreate của Activity chính (UI thread) nhưng việc sử dụng trong C/C++ là khi xử lý nativly rendering và tick trò chơi được gọi từ các phương thức native trong thực thi GLSurfaceView.

1) tài sảnMgr trỏ trỏ đến đối tượng hợp lệ trong toàn bộ thời gian ứng dụng? Là nó đủ để tạo ra nó cũng giống như biến tĩnh trên Java bên (trong lớp Activity) để thu gom rác sẽ không phá hủy nó?

2) có một số nguy hiểm mà tôi sẽ gặp phải một số vấn đề với chuỗi không?

Cảm ơn, Tom Atom

+0

Err ở bên an toàn và không lưu vào bộ nhớ cache. 'AAssetManager_fromJava()' rất nhanh. –

+0

Cảm ơn bạn đã trả lời. Lý do tại sao tôi muốn cache nó là tôi không biết cách lấy con trỏ mà không có "jobject assetManager" trong lời gọi phương thức. Vì vậy, tôi có phải thêm tham số này vào mỗi cuộc gọi đánh dấu từ Java đến C/C++ chỉ cho trường hợp tôi sẽ cần nó trong khi đánh dấu? Hoặc có cách nào đó làm sao tôi có thể truy vấn Java cho đối tượng trong thời gian khi tôi cần nó (hỏi Java cho AssetManager, sau đó gọi AAssetManager_fromJava, sau đó sử dụng nó ...) –

Trả lời

3

Một cách nhẹ an toàn hơn để bộ nhớ cache quản lý tài sản sẽ được giữ một tham chiếu toàn cầu để các đối tượng Java cơ bản ở phía bên C cùng với cache AAssetManager con trỏ. Ít nhất với điều đó bạn sẽ biết rằng đối tượng Java đằng sau/xung quanh đối tượng C sẽ không được thu thập rác.

Để làm điều đó, hãy gọi .

Và việc truy cập trình quản lý nội dung trong toàn bộ ranh giới chuỗi sẽ khá điên rồ, IMHO. Đó là một ràng buộc thiết kế rất mạnh - trừ khi được ghi rõ ràng, an toàn luồng không bao giờ có thể được giả định theo mặc định.

2

Tôi đã viết mô-đun NDK, Assetbridge, mà bạn cũng có thể thấy hữu ích. Nó xuất nội dung của tài sản/thư mục (tệp và thư mục) của dự án sang thư mục tạm thời, sau đó đặt biến môi trường cho đường dẫn đó, vì vậy mã gốc của bạn có thể chdir() vào thư mục tạm thời và bạn có thể sử dụng tiêu chuẩn cũ thông thường tập tin thư viện IO thói quen.

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