cuốn sách gpt4 ai đã làm

Không thể truy cập AAssetManager bằng mã gốc được truyền từ Java trong WallpaperService

In lại Tác giả: Taklimakan Thời gian cập nhật: 2023-11-01 21:24:44 25 4
mua khóa gpt4 Nike

Tôi đang cố truy cập Nội dung bằng mã gốc từ WallpaperService tùy chỉnh. Mã gốc biên dịch và hoạt động, nhưng việc cố gắng lấy tham chiếu AAssetManager từ đối tượng AssetManager được chuyển đến hàm gốc luôn trả về NULL.

Điều này có liên quan đến việc tôi sử dụng dịch vụ thay vì Hoạt động khiến tham chiếu AAssetManager trở thành NULL không? Trong mã nguồn Java, Trình quản lý tài sản được truyền cho hàm gốc là hợp lệ và không trống.

Để kiểm tra điều này, tôi đã sử dụng bản demo CubeLiveWallapers từ các mẫu họ cung cấp, nhắm mục tiêu API cấp 10. Sau đây là mã có liên quan được thêm vào lớp CubeWallapers1 để truy cập chức năng gốc:

tĩnh {
System.loadLibrary("trình kết xuất");
}

tải khoảng trống gốc tĩnh riêng tư (AssetManager mgr);

@Ghi đè
khoảng trống công khai trênCreate() {
super.onCreate();

Trình quản lý tài sản = getResources().getAssets();
tải(mg);
}

Đây là mã JNI tôi đang sử dụng để cố gắng lấy tham chiếu AAssetManager hợp lệ:

#include 
#include
#include
#include

#define TAG "CubeWallapers1.c"

void
Java_com_example_android_livecubes_cube1_CubeWallapers1_load(JNIEnv *env,
trình quản lý nội dung công việc) {

AAssetManager *mgr = AAssetManager_fromJava(env, assetsManager);
nếu (mgr == NULL) {
__android_log_print(ANDROID_LOG_ERROR, "CubeWallapers1.c", "lỗi tải quản lý nội dung");
} khác {
__android_log_print(ANDROID_LOG_VERBOSE, "CubeWallapers1.c", "trình quản lý tài sản đã tải");
}

}

Điều này đã được sao chép trên một số thiết bị, nhưng hầu hết thử nghiệm được thực hiện trên HTC Desire chạy 2.3.7.

câu trả lời hay nhất

Đọc nhận xét trong assets_manager_jni.h: "Lưu ý rằng người gọi có trách nhiệm thu thập và lưu tham chiếu VM vào dự án công việc để ngăn đối tượng gốc bị thu thập rác khi nó được sử dụng."

Trong Java, bạn đang truyền một đối tượng (mgr) có thể được trình thu gom rác giải phóng sau khi lệnh gọi lại gốc được gọi. Ví dụ: để ngăn chặn điều này, bạn có thể tạo biến mgr làm thuộc tính riêng trong lớp của mình và chuyển nó qua phương thức tải, ví dụ:

tải khoảng trống gốc tĩnh riêng tư (AssetManager mgr);

quản lý tài sản tư nhân;

@Ghi đè
khoảng trống công khai trênCreate() {
super.onCreate();

mgr = getResources().getAssets();
tải(mg);
}

Ngoài ra, tôi nghĩ bạn phải thay thế cuộc gọi lại C++ gốc bằng:

void Java_com_example_android_livecubes_cube1_CubeWallapers1_load
(JNIEnv *env, đối tượng công việc, Trình quản lý nội dung công việc)

Về android - Không thể truy cập AAssetManager bằng mã gốc được truyền từ Java trong WallpaperService, chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/10941802/

25 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress