- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想从接收来自另一个可执行文件的回调的 cpp 文件中调用 Java 类方法。
为了实现这一点,我使用 检索了一个 JavaVM 指针。 android::AndroidRuntime::getJavaVM() .cpp 文件中直接接收 JNI 方法调用的方法。我通过构造函数将这个 JavaVM 指针共享到最终的 .cpp 文件中,我在其中调用所需的 Java 方法,如下所示:
/* All the required objects(JNIEnv*,jclass,jmethodID,etc) are appropriately declared. */
**JNIEnv* env;
jvm->AttachCurrentThread(&env, NULL);
clazz = env->FindClass("com/skype/ref/NativeCodeCaller");
readFromAudioRecord = env->GetStaticMethodID(clazz, "readFromAudioRecord", "([B)I");
writeToAudioTrack = env->GetStaticMethodID(clazz, "writeToAudioTrack", "([B)I");**
最佳答案
如果您尝试使用 JNIEnv 或 JavaVM 引用而不将线程附加到 VM,则全局引用将不会阻止新线程中的段错误。你第一次做的很好,Mārtiņš Možeiko 错误地暗示你做的事情有问题。
不要删除它,只需学习如何使用它。那家伙不知道他在说什么,如果它在 jni.h 中,你可以很确定它不会去任何地方。它没有被记录的原因可能是因为它是荒谬的自我解释。您不需要创建 GlobalReference 对象或任何东西,只需执行以下操作:
#include <jni.h>
#include <string.h>
#include <stdio.h>
#include <android/log.h>
#include <linux/threads.h>
#include <pthread.h>
#define LOG_TAG "[NDK]"
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)
#define LOGW(...) __android_log_print(ANDROID_LOG_WARN,LOG_TAG,__VA_ARGS__)
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__)
static pthread_mutex_t thread_mutex;
static pthread_t thread;
static JNIEnv* jniENV;
void *threadLoop()
{
int exiting;
JavaVM* jvm;
int gotVM = (*jniENV)->GetJavaVM(jniENV,&jvm);
LOGI("Got JVM: %s", (gotVM ? "false" : "true") );
jclass javaClass;
jmethodID javaMethodId;
int attached = (*jvm)->AttachCurrentThread(jvm, &jniENV,NULL);
if(attached>0)
{
LOGE("Failed to attach thread to JavaVM");
exiting = 1;
}
else{
javaClass= (*jniENV)->FindClass(jniENV, "com/justinbuser/nativecore/NativeThread");
javaMethodId= (*jniENV)->GetStaticMethodID(jniENV, javaClass, "javaMethodName", "()V");
}
while(!exiting)
{
pthread_mutex_lock(&thread_mutex);
(*jniENV)->CallStaticVoidMethod(jniENV, javaClass, javaMethodId);
pthread_mutex_unlock(&thread_mutex);
}
LOGE("Thread Loop Exiting");
void* retval;
pthread_exit(retval);
return retval;
}
void start_thread(){
if(thread < 1)
{
if(pthread_mutex_init(&thread_mutex, NULL) != 0)
{
LOGE( "Error initing mutex" );
}
if(pthread_create(&thread, NULL, threadLoop, NULL) == 0)
{
LOGI( "Started thread#: %d", thread);
if(pthread_detach(thread)!=0)
{
LOGE( "Error detaching thread" );
}
}
else
{
LOGE( "Error starting thread" );
}
}
}
JNIEXPORT void JNICALL
Java_com_justinbuser_nativecore_NativeMethods_startThread(JNIEnv * env, jobject this){
jniENV = env;
start_thread();
}
关于multithreading - 在 Android NDK 中跨线程共享 JavaVM*,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10240791/
我目前是第一次使用 JVMTI。 我主要使用JVM(TM) Tool Interface Documentation如果有任何问题出现。 但是我找不到的是:除了通过调用 GetEnv(...) 来获取
我正在尝试在 RStudio 中加载“openNLP”库,但收到以下错误。当我尝试安装“RWeka”包时,我遇到了类似的错误。 如何解决此问题? library(openNLP) Error : .o
我必须编辑原始帖子,因为它具有误导性。我有一个使用 JNI 创建 JavaVM 的应用程序。它是用 C++ 和 QT5 框架编写的。如果我在应用程序的 .exe 文件旁边提供 .class 和 .ja
是否有框架或 api 可以让多个隔离的沙箱在单个 java vm 中运行? 最佳答案 在 Java 库的 Sun/Oracle 实现下,如果您想对可能松散地称为“GUI”的东西进行沙箱化,那么您需要使
这仅特定于 Windows。 JNI 是否提供任何 API 来返回调用进程的所有 JavaVM* 实例? 考虑以下场景,一个 C++ dll 被注入(inject)到一个 java.exe 进程中。现
我有一个 C 共享库,它通过 JNI 从 Java 应用程序中使用。我需要存储一些计算成本高昂的数据,这些数据在 JavaVM 的生命周期内有效。我想将它存储在 C 中的 static 变量中,以便它
最近在玩Xcode,有一个框架叫做JavaVM.framework。这个框架有什么用,我该如何使用它? 这是否允许我以某种方式构建使用 Java 库的 Objective-C 应用程序? 最佳答案 J
JavaVM *javaVM = NULL;JNIEnv *jniEnv = NULL; ( createJavaVM )( &javaVM, ( void * )&jniEnv, &javaVMIn
目前最高的 JNI 版本似乎是 JNI_VERSION_1_6,所以我应该将它作为第二个参数传递给 GetEnv。但是有没有一种更通用的方法来获取实际的 JNI 版本,以便将来当这个版本增加时,我不需
我正在尝试使用 c++ 启动 jvm。这是我的 CmakeLists.txt 和 ny C++ 代码。 我的系统是 macOS Mojave 10.14.6 Java 使用 homebrew cask
我想从接收来自另一个可执行文件的回调的 cpp 文件中调用 Java 类方法。 为了实现这一点,我使用 检索了一个 JavaVM 指针。 android::AndroidRuntime::getJav
As we know JNIEnv is the pointer to the VM. And as name suggests JavaVM is a VM itself. Is there any
可能是个傻瓜!@# 问题。 我对开发 Android 应用一无所知,但我想知道 Android 应用在编译时生成的代码是纯 ANDROID 原生代码,还是 Java 虚拟机兼容代码。 非常感谢。 最佳
我想知道,在编译为 java 1.4 编写的 java 源代码时,-source 和 -target 开关设置为 1.4,是否会使用中间版本中内置的一些/任何优化。我的第一个意图是说当然不是,因为在编
我是 Java 编程的新手,因此如果这听起来像一个愚蠢的问题,我提前道歉。 我正在尝试构建一个用纯 C 编写的简单应用程序,它必须创建一个 JavaVM,然后通过加载基于 AWT/Swing 的 ja
我有一个 64 位操作系统,安装了 phpStorm 9.0.2。 我遇到内存不足错误,看起来 JVM32bit 可能无济于事。 如何将 JVM32 位版本升级到 JVM64 位? 它只是像下载 64
我想在安装了 JavaRE 的 Windows 系统上启动 java 程序。通常 PATH 变量没有设置,所以我必须找到 JavaRE。我怎样才能意识到这一点? 最佳答案 您能更具体地说明您的问题吗?
我正在尝试模拟 https://github.com/jni-rs/jni-rs/blob/master/tests/jni_api.rs 的测试用例和 https://github.com/jni-
我尝试在 IntelliJ 中运行 java 项目并收到该错误:JavaVM 警告:加载 JVM 后必须调用 JAWT_GetAWT未找到 AWT 我使用Mac OS 10.11和jdk 1.8 这个
我刚刚为我的网站购买了一个 shell 访问插件,并尝试运行一个基于 java 的程序,但没有成功。 我调查了一下,发现我需要 JavaVM,但找不到用于 linux 共享 Web 服务器的软件。我在
我是一名优秀的程序员,十分优秀!