- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当我尝试从 C++ 中的线程调用 JVM 时,调试器说 JNIEnv 指针消失了。代码:
void thread_call(JNIEnv* env,jobject text_view,jmethodID setText,const char* str){
env->CallVoidMethod(text_view,setText,env->NewStringUTF(str));
}
JNIEXPORT jstring JNICALL
Java_com_example_project_1lenspath_MainActivity_initPullThread(
JNIEnv *env,
jobject, jobject text_view){
...
std::thread pull(thread_call,env,text_view,setText,std::to_string(t).c_str());
...
}
//Debugger:
error: use of undeclared identifier 'env'
有没有不用 JNIEnv 或任何其他解决方案调用 JVM 的方法?
最佳答案
您可以在 JNI_OnLoad
中缓存 jvm 指针,例如
JavaVM* g_jvm;
jint JNI_OnLoad(JavaVM* vm, void* reserved)
{
g_jvm = vm;
...
return result;
}
然后使用此 g_jvm
执行 AttachCurrentThread
和 DetachCurrentThread
,例如
void foo()
{
jint res = javaVM->GetEnv((void**)&env, JNI_VERSION_1_6);
if (res != JNI_OK) {
res = javaVM->AttachCurrentThread(&env, NULL);
if (JNI_OK != res) {
return NULL;
}
}
...
g_jvm->DetachCurrentThread();
}
参见:https://github.com/russell-shizhen/JniExample/blob/master/app/src/main/cpp/native-lib.cpp
关于android - 如何防止 JNIEnv 超出线程范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58256495/
我看到一些 jni 签名如下: // jni // WAY-1 JNIEXPORT void JNICALL Java_com_test_Test_testMethod(JNIEnv *env, j
我正在使用它们之间的 native 库编写一些 Java.NET 互操作代码,到目前为止一切进展顺利。 但是由于某些原因,我无法在 JNIEnv 下运行任何方法。 System::String^ JN
当我尝试从 C++ 中的线程调用 JVM 时,调试器说 JNIEnv 指针消失了。代码: void thread_call(JNIEnv* env,jobject text_view,jmethodI
我很好奇为什么 jni programming guide说 The JNI provides a slightly cleaner interface for C++ programmers. Th
我有一个使用 JNI 的 Android 项目。在实现监听器类的 CPP 文件中,有一个回调 x() 。当调用 x() 函数时,我想调用 java 类中的另一个函数。但是,为了调用该 java 函数,
我对 NDK 有疑问。 在我的 JNI_OnLoad 方法中,我缓存了 JavaVm 指针、调用该方法的类以及我稍后使用的方法 ID: JNIEXPORT jint JNICALL JNI_OnLoa
跨多个 JNI 调用缓存 JNIEnv 对象是否安全?例如,我可以做类似的事情吗 void foo(JNIEnv* env) { static JNIEnv* cached; if(
我将 JNIEnv 存储在全局中,以便稍后调用静态 java 方法。但是,存储一个指向 JNIEnv 的全局指针是否有必要,它们与任何其他 java 对象一样,或者它是一种不需要这个的特殊情况。 JN
我有一个 C++ dll,我想通过将函数导出到 C# 来在 Unity 中使用它。 Unity 项目在 Android 设备上运行,C++ 代码使用 java。要初始化 C++,我需要先调用以下函数:
在java中我有: package com.mypkg.utils; ... public class attitude_calculator { private long native_pt
我有两个文件:MyJni.cpp 是 jni 文件。而MyObject.c是一个普通的c文件。 这是 MyJni.cpp 文件的代码: JNIEXPORT void createMyObject(
JavaVM *javaVM = NULL;JNIEnv *jniEnv = NULL; ( createJavaVM )( &javaVM, ( void * )&jniEnv, &javaVMIn
在 Monodroid 中,我试图通过 JNIEnv 访问自定义 Java 类。当我在主项目中添加类时,我可以在主项目和库项目中访问它。 例如:如果 jniTest.java 是项目 A 中的 And
我是运行第一个 hello JNI 示例的 Android NDK 新手。我添加了 jni 文件夹并添加了 c 文件,其中我收到一些 Unresolved 错误。 我也将项目转换为 C/C++ 并在
了解到JNI接口(interface)指针(JNIEnv *)只在当前线程中有效。假设我在 native 方法中启动了一个新线程;它如何将事件异步发送到 Java 方法?因为这个新线程不能引用(JNI
As we know JNIEnv is the pointer to the VM. And as name suggests JavaVM is a VM itself. Is there any
我需要在我的 native 库中获取 Android 唯一设备 ID。据我所知,它可以用Java API来完成,我需要使用JNI。我读过this ,也有类似的问题,但是访问的是不同的ID。但是这个解决
我的 Main.cpp 文件中有一个这样的 JNI 调用: JNIEXPORT jstring JNICALL Java_packagename_MainActivity_Generate
我一直在尝试调用 JNIEnv 函数 GetVersion(对于初学者),其索引为 4(根据 this site )。 我一直在使用 this site供引用,并通过使用 [ebp + x] 而不是参
我对此方法的定义感兴趣。但我只找到了 jni.h 文件中的声明......我猜一定有一个实现! :)谢谢 最佳答案 jni.h 文件在其提供的定义集中是跨 JVM 的标准。实际的实现随您的 JVM 一
我是一名优秀的程序员,十分优秀!