Tôi gặp sự cố JNI mà tôi hy vọng ai đó có thể giúp tôi.
Tôi đang cố gắng gọi một hàm tạo của một lớp Java có tên là LUSOutputJNI từ một chuỗi gốc.
Nó không làm hỏng trên FindClass (...) của lớp học cụ thể này.Sự cố khi gọi phương thức Java từ chủ đề gốc bằng JNI (C++)
Đây là mã:
LOGE("1");
JNIEnv *env = NULL;
LOGE("2");
int res = -1;
res = g_vm->AttachCurrentThread(&env, NULL);
if(env == NULL)
{
LOGE("env is NULL, AttachCurrentThread failed");;
}
if(res >= 0)
LOGE("AttachCurrentThread was successful");
jclass clazz = NULL;
jmethodID cid;
jclass clazzESEngine;
jmethodID callbackid;
jobject jCoreOut;
static jfieldID fid_ActionState = NULL;
static jfieldID fid_nSpeed = NULL;
static jfieldID fid_nType = NULL;
static jfieldID fid_nInProcess = NULL;
static jfieldID fid_nX = NULL;
static jfieldID fid_nY = NULL;
LOGE("3");
static const char* const ECOClassName = "lus/android/sdk/LUSOutputJNI";
//static const char* const ECOClassName = "android/widget/TextView";
clazz = env->FindClass(ECOClassName);
if (clazz == NULL) {
LOGE("Can't find class LUSOutputJNI");
}
else
LOGE("lus/android/sdk/LUSOutputJNI was found, YEY!!");
LOGE("4");
cid = env->GetMethodID(clazz,"<init>", "()V");
LOGE("5");
jCoreOut = env->NewObject(clazz, cid);
LOGE("6");
Đây là kết quả logcat từ khi nó không thành công:
E/lusCore_JNI(3040): 1
E/lusCore_JNI(3040): 2
E/lusCore_JNI(3040): AttachCurrentThread was successful
E/lusCore_JNI(3040): 3
E/lusCore_JNI(3040): Can't find class LUSOutputJNI
E/lusCore_JNI(3040): 4
W/dalvikvm(3040): JNI WARNING: JNI method called with exception raised
Quan sát:
- tôi nhận được một kết quả từ AttachCurrentThread là 0, whic h có nghĩa là tập tin đính kèm này đã thành công + con trỏ env không còn là NULL.
- Tôi chắc chắn về việc khai báo tên gói của LUSOutputJNI (gấp ba lần kiểm tra ...)
- Khi tôi cố gắng chạy FindClass (..) với tên lớp phổ biến hơn như android/widget/TextView, I có được một trận đấu tích cực. Nó ở đó. Có nghĩa là các tập tin đính kèm thread và các biến env là ok. (Tôi có thể giả định điều đó không?)
- Khi tôi cố gắng chạy đoạn mã sau từ một phương pháp JNI có chuỗi JNI chạy nó, nó tìm thấy lớp LUSOutputJNI mà không có vấn đề gì.
Tôi đang làm gì sai?
Trợ giúp sẽ được nhiều đánh giá cao :)
Cảm ơn thời gian của bạn,
Ita
Bất kỳ tham chiếu nào đến lớp 'LUSOutputJNI' này? –
@ K-ballo: Đây có thể là một lớp học trong nhà. –
@Ita: Trình khởi tạo tĩnh LUSOutputJNI của bạn có ném ngoại lệ không? Bạn nên in ngoại lệ được nêu ra. –