- 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/
我正在编写一个具有以下签名的 Java 方法。 void Logger(Method method, Object[] args); 如果一个方法(例如 ABC() )调用此方法 Logger,它应该
我是 Java 新手。 我的问题是我的 Java 程序找不到我试图用作的图像文件一个 JButton。 (目前这段代码什么也没做,因为我只是得到了想要的外观第一的)。这是我的主课 代码: packag
好的,今天我在接受采访,我已经编写 Java 代码多年了。采访中说“Java 垃圾收集是一个棘手的问题,我有几个 friend 一直在努力弄清楚。你在这方面做得怎么样?”。她是想骗我吗?还是我的一生都
我的 friend 给了我一个谜语让我解开。它是这样的: There are 100 people. Each one of them, in his turn, does the following
如果我将使用 Java 5 代码的应用程序编译成字节码,生成的 .class 文件是否能够在 Java 1.4 下运行? 如果后者可以工作并且我正在尝试在我的 Java 1.4 应用程序中使用 Jav
有关于why Java doesn't support unsigned types的问题以及一些关于处理无符号类型的问题。我做了一些搜索,似乎 Scala 也不支持无符号数据类型。限制是Java和S
我只是想知道在一个 java 版本中生成的字节码是否可以在其他 java 版本上运行 最佳答案 通常,字节码无需修改即可在 较新 版本的 Java 上运行。它不会在旧版本上运行,除非您使用特殊参数 (
我有一个关于在命令提示符下执行 java 程序的基本问题。 在某些机器上我们需要指定 -cp 。 (类路径)同时执行java程序 (test为java文件名与.class文件存在于同一目录下) jav
我已经阅读 StackOverflow 有一段时间了,现在我才鼓起勇气提出问题。我今年 20 岁,目前在我的家乡(罗马尼亚克卢日-纳波卡)就读 IT 大学。足以介绍:D。 基本上,我有一家提供簿记应用
我有 public JSONObject parseXML(String xml) { JSONObject jsonObject = XML.toJSONObject(xml); r
我已经在 Java 中实现了带有动态类型的简单解释语言。不幸的是我遇到了以下问题。测试时如下代码: def main() { def ks = Map[[1, 2]].keySet()
一直提示输入 1 到 10 的数字 - 结果应将 st、rd、th 和 nd 添加到数字中。编写一个程序,提示用户输入 1 到 10 之间的任意整数,然后以序数形式显示该整数并附加后缀。 public
我有这个 DownloadFile.java 并按预期下载该文件: import java.io.*; import java.net.URL; public class DownloadFile {
我想在 GUI 上添加延迟。我放置了 2 个 for 循环,然后重新绘制了一个标签,但这 2 个 for 循环一个接一个地执行,并且标签被重新绘制到最后一个。 我能做什么? for(int i=0;
我正在对对象 Student 的列表项进行一些测试,但是我更喜欢在 java 类对象中创建硬编码列表,然后从那里提取数据,而不是连接到数据库并在结果集中选择记录。然而,自从我这样做以来已经很长时间了,
我知道对象创建分为三个部分: 声明 实例化 初始化 classA{} classB extends classA{} classA obj = new classB(1,1); 实例化 它必须使用
我有兴趣使用 GPRS 构建车辆跟踪系统。但是,我有一些问题要问以前做过此操作的人: GPRS 是最好的技术吗?人们意识到任何问题吗? 我计划使用 Java/Java EE - 有更好的技术吗? 如果
我可以通过递归方法反转数组,例如:数组={1,2,3,4,5} 数组结果={5,4,3,2,1}但我的结果是相同的数组,我不知道为什么,请帮助我。 public class Recursion { p
有这样的标准方式吗? 包括 Java源代码-测试代码- Ant 或 Maven联合单元持续集成(可能是巡航控制)ClearCase 版本控制工具部署到应用服务器 最后我希望有一个自动构建和集成环境。
我什至不知道这是否可能,我非常怀疑它是否可能,但如果可以,您能告诉我怎么做吗?我只是想知道如何从打印机打印一些文本。 有什么想法吗? 最佳答案 这里有更简单的事情。 import javax.swin
我是一名优秀的程序员,十分优秀!