- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有点惊讶我必须发布一个看起来相当琐碎且易于查找的问题......但显然不是。
因为它看起来我的 jni.h
和 libJvm.so
库不同步(或者我怀疑如此),它显示试图加载我的 Java应用程序作为库进入 Linux 上的 C++ 环境(使用 JNI_CreateJVM()
等等),我想知道这可能是罪魁祸首。 jni.h
只是标准的,包含所有普通模块.... libJvm.so
但是......我看不到内容是什么......我甚至不知道它到底是什么以及它是如何/在哪里 build 的。
谁能给我解释/回答这个问题?
附言这些问题与库路径和相关问题无关...可以找到 libJvm.so
。只要我不完全了解我正在使用的所有组件,就很难理解出了什么问题......
根据对我的问题的 react 中出现的评论进行更新(这是一个非常长的更新,因为我认为包含我正在使用的代码可能是有见地的)...
我正在使用(并遇到问题)的代码,在代码之后我还说了一些关于环境/设置和情况的事情......:
#include <jni.h>
#include "jvm.h"
#include <iostream>
#include <stdlib.h>
#include <dlfcn.h>
using namespace std;
//Create type for pointer to the JNI_CreateJavaVM function
typedef jint (*CreateJvmFuncPtr) (JavaVM**, void**, JavaVMInitArgs*);
//New method returns pointer to the JNI_CreateJavaVM function
CreateJvmFuncPtr findCreateJvm() {
CreateJvmFuncPtr createJvm = NULL;
void* jvmLib = dlopen("/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.71.x86_64/jre/lib/amd64/server/libjvm.so", RTLD_LAZY); //Get handle to jvm shared library
char* error = dlerror(); //Check for errors on dlopen
if(jvmLib == NULL || error != NULL) {
printf("FailedToLoadJVM\n");
}
//Load pointer to the function within the shared library
createJvm = (CreateJvmFuncPtr) dlsym(jvmLib, "JNI_CreateJavaVM");
error = dlerror();
if(error != NULL) {
printf("Success\n");
}
return createJvm;
int main() {
// load and initialize JVM and JNI interface, in a test setting where JVM is "passive"
// (called/loaded as .dll) and the JNI env is not available yet from a Java/JVM call
// (which would be the caste in the normal setup/configuration).
//int jniLoadJvmAsDll()
//{
JavaVM *jvm; // Pointer to the JVM (Java Virtual Machine)
JNIEnv *env; // Pointer to native interface
//======== prepare loading of Java VM: assign init arguments for JVM init =========
JavaVMInitArgs vm_args; // Initialization arguments
// JavaVMOption* vmOptions = new JavaVMOption[1]; // JVM invocation options
JavaVMOption vmOptions[4];
// (=> comparable to lib path for System.load(libPath/libName)
vmOptions[0].optionString = "-Djava.compiler=NONE"; /* disable JIT */
vmOptions[1].optionString = "-Djava.class.path=/home/adminuser/workspace_Unit_Test_Java_Cpp/Unit_Test_Jni_Java/bin"; // which Java class to load
vmOptions[2].optionString = "-Djava.library.path=/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.71.x86_64/jre/lib/amd64/;/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.71.x86_64/jre/lib/amd64/server";
vmOptions[3].optionString = "-verbose:jni"; /* print JNI-related messages */
vm_args.version = JNI_VERSION_1_6; // minimum Java version
vm_args.nOptions = 1; // number of options
vm_args.options = vmOptions;
vm_args.ignoreUnrecognized = false; // invalid options make the JVM init fail
//=============== load and initialize Java VM and JNI interface =============
// old code: jint retCrJvm = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args); // YES !!
//New code:
CreateJvmFuncPtr createJVM = findCreateJvm();
printf("findCreateJVM() returned 0x%x\n", createJVM);
jint retCrJvm = createJVM(&jvm, (void**)&env, &vm_args);
//End new code
delete vmOptions; // we then no longer need the initialization options.
if (retCrJvm != JNI_OK) {
// TO DO: error processing...
cin.get();
exit(EXIT_FAILURE);
}
//====================handle multithread situatiation ========================
JavaVM * curVM = NULL; // JVM in current thread, should contain loaded VM
// otherwise we're not in the main thread
JNIEnv *curEnv;
int jvmLoadFailed = 1;
// handle situation that we're not in the main thread (current thread isnt't main thread)
if (jvm == NULL) {
env->GetJavaVM( &curVM ); // JVM should contain current/main thread JVM, otherwise
// we're not in the main thread
int vmStat = curVM->GetEnv((void **)&curEnv, JNI_VERSION_1_6);
if (vmStat == JNI_EDETACHED) //We are on a different thread, attach
curVM->AttachCurrentThread((void **) &curVM, NULL);
if( curVM == NULL )
return jvmLoadFailed; //Can't attach to java, bail out
}
//=============== Display JVM version =======================================
cout << "JVM load (as .so/.dll) succeeded: Version ";
jint ver = env->GetVersion();
std::cout << ((ver>>16)&0x0f) << "."<<(ver&0x0f) << endl;
// TO DO: add the code that will use JVM <============ (see next steps)
// insert the JNITools separate methods here.... for each separate graphical structure
// initially a test class is inserted.....
jclass clsTestPrint = env->FindClass("TestPrint"); // try to find the class
if(clsTestPrint == NULL) {
cerr << "ERROR: class not found !";
}
jmethodID ctor = env->GetMethodID(clsTestPrint, "<init>", "()V"); // find an object constructor for this class
if(ctor == NULL) {
cerr << "ERROR: constructor not found !" << endl;
}
else {
cout << "Object succesfully constructed !"<<endl;
jobject prtObj = env->NewObject(clsTestPrint, ctor); // invoke the object constructor: create print object
if (prtObj) {
jmethodID show = env->GetMethodID(clsTestPrint, "showId", "()V");
if(show == NULL)
cerr << "No showId method !!" << endl;
else env->CallVoidMethod(prtObj, show);
}
}
jvm->DestroyJavaVM();
cin.get();
return 0;
//}
其中“dlopen”和“dlsym”当然会替换您将在 Windows 上使用的“loadLibrary()”和“getProcaddress()”调用,以便 1. 加载 .dll 并获取相应 JNI 过程的句柄。 .但我是在 Linux 上做的,因此是“等效翻译”......
“多线程”装饰在这里并不是真正相关的....添加它是为了将来可能的目的。
经过一些实验后,我成功地配置了build设置,因此也找到了 libjvm.so,并且在其中找到了 API JNI 方法 JNI_CreateJavaVM()....为此,我添加了(在 Linux 上,使用 Eclipse)以下“GCC C++ 链接器”设置:-- => "库"=> "库 (-l)"=> "Jvm"和=>“图书馆搜索路径(-L)”=>“/usr/lib/jvm/java-1.7.0.openjdk-1.7.0.71.x86_64/jre/lib/amd64/server”
-- => "共享库设置"=> "共享对象名"=> "libjvm.so"
其他设置在编译/链接期间出错。
这样就可以搭建环境了。调试器在 main 中启动和停止,我可以像往常一样单步执行 C++ 代码,直到...我到达 JNI_CreateJavaVM() 调用。这时会出现以下错误。
重定位错误:/home/adminuser/workspace_Unit_Test_Java_Cpp/Unit_Test_Jni_Cpp/Debug/Unit_Test_Jni_Cpp:符号 JNI_CreateJavaVM,版本 SUNWprivate_1.1 未在具有链接时间引用的文件 libjvm.so 中定义
我强烈怀疑: 1. jni头文件和库(libJvm.so)不同步,或者 2.类路径或库路径不包含正确的值3. 加载(使用“dlopen”)的 Java .so (.dll) 不是它应该的....
知道要使用哪个值吗?
这是“我的问题的背景:判断jni和libJvm.so内容是否不同步,是不是很方便知道是什么,大概在什么地方....
最佳答案
a) 确保 /usr/lib/jvm/java-1.7.0.openjdk-1.7.0.71.x86_64/jre/lib/amd64/
在您的 LD_LIBRARY_PATH 上
b) 切换回“旧代码”加载 libjvm.so 隐式不使用 dlopen 和东西。
关于java - 什么是 libJvm.so,它是什么时候构建的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48559785/
我有一个使用 voce.h 的程序,它又使用 jvm。 我已经包含了所有必要的 java 文件并链接到 libjvm.so 所以我现在没有收到编译器错误但是当我运行程序时我收到错误消息: error
我见过的所有 JNI 指南(例如 JNI runtime linking )都建议我将 JNI 库链接到 libjvm.so: $ gcc -I${JAVA_HOME}/include -c -o t
我有点惊讶我必须发布一个看起来相当琐碎且易于查找的问题......但显然不是。 因为它看起来我的 jni.h 和 libJvm.so 库不同步(或者我怀疑如此),它显示试图加载我的 Java应用程序作
我在深入了解我们遇到的 Java 热点错误时遇到了真正的问题。错误似乎是随机的,并且有问题的框架各不相同。示例错误如下所示: # # A fatal error has been detected b
嗨,谢谢您的阅读, 运行程序时出现以下错误,无法确定解决方案是什么。我还在这里查看了所有带有类似错误的主题,但无法解决我的问题。这里的错误: # A fatal error has been dete
startJVM是加载jvm用的方法。在JPype,apache mod等等很多地方都用到。但凡要用其他语言来加载jvm进程,就要用到这个。 可惜往往会出错。一般都是 复制代码代码如下:
当我在我的 Mac 上设置 flyway 时,当我尝试执行命令 ./flyway info 以验证我已正确完成的所有配置时,我曾经收到错误消息 - libjvm.dylib” cannot be op
我正在尝试制作这个 JNI example作品。我能够编译所有文件,但由于这个错误我无法启动可执行文件: ./TEST: error while loading shared libraries: l
我在以下 Node 插件中收到错误并提出了一个问题:插件在这里:https://github.com/joeferner/node-java问题在这里:https://github.com/joefe
我通过ppa:ubuntugis/ubuntugis-unstable安装了QGIS 。我的 Ubuntu 12.04 附带 OpenJDK 1.7.0。当我从命令行启动 qgis 时,返回以下错误消
我在rhel上安装了eclipse。我配置完jdk以外的环境后,出现了问题。 Failed to load the JNI shared library libjvm.so 我在网上搜索了这个问题的解
我在 Cent OS 6.6 上安装了 java-1.7.0-openjdk-1.7.0.65-2.5.1.2.el6_5.x86_64。当我尝试运行我的软件时,出现“libjvm.so错误的ELF类
我从 Oracle Pages 7u10 安装最新的 jdk。当我有 java6 时一切正常,但现在我无法运行 netbeans 或 java 首选项(来自系统首选项),因为我收到错误:使用 libj
我正在尝试在我的程序中嵌入 java 虚拟机,但我的 libjvm.dylib 缺少 JNI_GetCreatedJavaVMs。 该程序在 Windows 和 Linux 平台上都运行良好。但是,在
当我在我的 linux(64 位)上使用 javavm 时,我收到错误消息:.../amd64/server/libjvm.so:无法识别文件:无法识别来自文件。 我找不到关于此的任何有用信息。 将
我正在使用 STAF v3.4.24 在 Sles12sp2 上进行重启测试,一段时间后我收到此错误: # A fatal error has been detected by the Java Ru
我正在尝试在 Centos 5.7 vagrant box 中运行 jetty(它在“真实”计算机上运行良好;使用 centos 和 linux mint 进行了测试)。这是 header 错误: #
您好,感谢您的阅读, 我在运行我的程序时遇到以下错误,我不知道解决方案是什么。我还查看了此处出现类似错误的所有主题,但无法解决我的问题。这里的错误: # A fatal error has been
尝试使用此代码在我的 14.10 ubuntu 上的 R 上安装 rJava 包 if (!require(rJava)) install.packages('rJava') 在重新安装 jdk 后遇
我有一个Java项目需要加载一些原生动态库。 我运行 64 位 JVM,我需要加载 64 位动态库,但出现以下异常: java.lang.UnsatisfiedLinkError: /Users/ma
我是一名优秀的程序员,十分优秀!