【发布时间】:2011-09-12 20:50:11
【问题描述】:
我有一个 JNI 问题,希望有人能帮我解决。
我正在尝试从本机线程调用名为 LUSOutputJNI 的 Java 类的构造函数。
它在这个特定类的 FindClass(...) 上一直失败。
代码如下:
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");
这是失败时的 logcat 输出:
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
观察:
- 我从 AttachCurrentThread 得到的结果是 0,这意味着这个附件是成功的 + env 指针不再是 NULL。
- 我确定 LUSOutputJNI 的包名声明(三重检查...)
- 当我尝试使用更流行的类名(例如 android/widget/TextView )运行 FindClass(..) 时,我得到了肯定的匹配。它就在那里。意味着线程附件和环境变量都可以。 (我可以假设吗?)
- 当我尝试从运行有 JNI 线程的 JNI 方法运行以下代码时,它发现 LUSOutputJNI 类没有问题。
我做错了什么?
我们将不胜感激:)
感谢您的宝贵时间,
意大利
【问题讨论】:
-
对这个“LUSOutputJNI”类的任何引用?
-
@K-ballo:可能是内部课程。
-
@Ita:您的 LUSOutputJNI 静态初始化程序是否抛出异常?您应该打印引发的异常。
-
@lta 你应该修复你的错误处理。这让我哭了。
-
LUSOutputJNI 在类路径中吗?
标签: c++ java-native-interface android-ndk