gpt4 book ai didi

c++ - 使用 JNI (C++) 从 native 线程调用 Java 方法时出现问题

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:16:59 27 4
gpt4 key购买 nike

我有一个 JNI 问题,希望有人能帮我解决。
我正在尝试从 native 线程调用名为 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 类没有问题。

我做错了什么?

帮助将不胜感激:)

谢谢你的时间,

意大利

最佳答案

在此处找到答案\解决方法。 (查找常见问题解答:“FindClass 没有找到我的类(class)” JNI tips )

我基本上将全局引用保存到所需的 jclass 对象。
然而,必须克服 C/JNI 和 C++/JNI 之间的一些邪恶的 JNI 更改才能编译代码。
这就是我让 NewGlobalRef 编译和工作的方式。

jclass localRefCls = env->FindClass(strLUSClassName);
if (localRefCls == NULL) {
LOGE("Can't find class %s",strLUSCoreClassName);
return result;
}

//cache the EyeSightCore ref as global
/* Create a global reference */
clazzLUSCore = (_jclass*)env->NewGlobalRef(localRefCls);

/* The local reference is no longer useful */
env->DeleteLocalRef(localRefCls);

/* Is the global reference created successfully? */
if (clazzLUSCore == NULL) {
LOGE("Error - clazzLUSCore is still null when it is suppose to be global");
return result; /* out of memory exception thrown */
}

我希望这对任何人都有帮助。

关于c++ - 使用 JNI (C++) 从 native 线程调用 Java 方法时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7393879/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com