Tag: jni

如何用JNI或JNA阅读窗口标题?

希望重新回到发展空间; 主要使用Java来调用一些原生的win32函数(我不想在.NET中构建)…. 有人能指出我可以使用Java(JNI / JNA / SWIG)从不同的运行窗口读取标题的地方。 假设您将知道您尝试连接的应用程序在内存空间中的位置。

我必须将所有依赖DLL放入JDK的bin文件夹中吗?

我的java应用程序依赖于DLL,该DLL 进一步依赖于libstdc++-6.dll 。 我尝试过了: 将libstdc++-6.dll放在一个文件夹中 并将文件夹放在%PATH% 然后我遇到了java.lang.Unsatisfied LinkError: The specified procedure could not be found从Eclipse启动应用程序时java.lang.Unsatisfied LinkError: The specified procedure could not be found 。 但是如果我把libstdc++-6.dll放到JDK’s bin folder ,比如C:\Java\jdk1.6.0_45_32bit\bin 。 它工作正常。 但我不想污染JDK文件夹。 我记得windows会搜索%PATH%来定位依赖的DLL。 为什么我不能在这个问题上使用%PATH%? 更新1 Windows中有2个不同的%PATH%环境变量。 用户变量 系统变量 我只是偶然发现: 如果我将DLL的文件夹放到User%PATH%,则无法找到它。 如果我将DLL的文件夹放到System%PATH%,它可以工作。 为什么? 更新2 灵感来自这个线程: 系统与用户PATH环境变量… winmerge只有在我添加路径到用户PATH时才有效 我开始怀疑我的User%Path%可能太长了 。 所以我将包含我的依赖DLL的文件夹路径从User%PATH%的末尾移动到开头 。 它现在有效! 首先,我得出结论,实现Windows的DLL查找算法的人有一些截断问题。 我几乎认为这是另一个恼人的Windows Bug。 但我写了另一个Windows应用程序,它有类似的DLL依赖关系来证实我的猜测。 该应用程序工作正常! […]

使用JNI从C ++程序执行java jar,使用g ++或eclipse

我正在尝试从 C ++程序调用/ 执行 java jar 。 以下是我到目前为止找到的选项: Use JNI Use Jace Use JunC++ion Use execl(“java”, “java”, “-jar”, “myprog.jar”, NULL); Use execlp(“java”, “java”, “-jar”, “myprog.jar”, (char *)0); Use system(“java filename.jar”); Use popen(“java -jar test.jar text1 text2”, “r”); Use CreateProcess(…); Use JNA 我想使用JNI,但是我遇到了问题。 ======================== HELLO.CPP 我有一个简单的Hello.cpp类: #include #include using namespace std; int main() { cout << […]

进行涉及Java的RAW套接字编程的最佳方法

我有一些现有的C代码使用ICMP原始套接字来执行Ping,我需要在Java中使用此代码,因为Java不支持ICMP包。 当我在JNI中包装代码并调用它时,C代码在执行以下操作时无法获取套接字: socket(AF_INET,SOCK_RAW,1); 我想Java已经放弃了一些禁用Java进程中使用原始套接字的权限。 我必须找到解决方案。 我观察到以下情况: 如果我编写一个C程序并使用Runtime从Java调用它,分叉代码可能会打开套接字。 如果我从Eclipse运行这个本机代码,它也运行良好。 我想这是因为Eclipse已经从eclipse.exe启动,而不是从java.exe启动。 这意味着我可以通过选择这两种策略中的一种来解决我的问题,但我也不喜欢。 有没有其他方法可以让Java接受JNI代码打开这个套接字? 编辑:我越是关注这个问题,我认为它必须与Windows 7的启动方式有关。 看起来如果你让Windows运行起来,或者你在Windows以外的其他平台上,也可以使用InetAddress.isReachable()方法。

Windows上的Java JNI和依赖库

长话短说:我有一个可执行jar,它调用依赖于lib.dll 。 而且我得到了那些令人恐惧的UnsatisfiedLinkError 。 这个答案非常接近,但根据我的经验,它无法解决问题。 即使在java.library.path指定了dll驻留的文件夹,它也不起作用。 我也必须更改Windows PATH环境变量。 实际上,Windows上的默认java.library.path似乎是PATH 。 有没有“漂亮”的方法来解决这个问题? 我想为Windows构建一个安装程序,我想知道如何处理这个问题,以便最终用户不必做任何手动工作。 编辑: 我实现的内容如下:应用程序附带一个名为“native_libs”的文件夹,该文件夹具有适用于所有受支持体系结构的动态库。 结构如下: / +- native_libs/ +- windows/ | +- x86/ | | +- … | +- x64/ | +- … | +- linux/ | +- x86/ | | +- … | +- x64/ | +- … | +- libs/ +- … 在运行时,在应用程序初始化时,会检测到正确的JRE体系结构和系统OS,并将正确的库文件复制到libs […]

我应该如何为JNI加载本机库以避免出现UnsatisfiedLinkError?

我想在Ubuntu 8.10上使用JNI,使用Eclipse和gcc(如果有风味,则使用Ubuntu的标准版)。 尽管make文件成功创建,我似乎无法加载我的库。 主要的Java类如下: class Hello { public native void sayHello(); static { System.loadLibrary(“hello.so”); } public static void main(String[] args) { Hello h = new Hello(); h.sayHello(); } } 我的make文件是这样的; all : hello.so hello.so : Hello.o gcc -shared -o hello.so Hello.o Hello.o : Hello.c Hello.h gcc -I/usr/lib/jvm/java-6-sun/include -I/usr/lib/jvm/java-6-sun/include/linux -c Hello.c -o Hello.o Hello.h : Hello.class […]

使用Invocation API进行JNI内存管理

当我使用JNI方法构建java对象时,为了将其作为参数传递给我正在使用JNI调用API调用的java方法,我该如何管理它的内存? 这是我正在使用的: 我有一个C对象,它有一个析构函数方法,它比free()更复杂。 这个C对象与Java对象相关联,一旦应用程序完成Java对象,我就不再需要C对象了。 我正在创建这样的Java对象(为了清楚起见,错误检查已被省略): c_object = c_object_create (); class = (*env)->FindClass (env, “my.class.name”); constructor = (*env)->GetMethodID (env, class, “”, “(J)V”); instance = (*env)->NewObject (env, class, constructor, (jlong) c_object); method = (*env)->GetMethodID (env, other_class, “doSomeWork”, “(Lmy.class.name)V”); (*env)->CallVoidMethod (env, other_class, method, instance); 所以,既然我已经完成了instance ,我该怎么办呢? 理想情况下,我想将垃圾收集器留给VM; 当它用instance完成时,如果它还在我提供给它的指针上调用了c_object_destroy() ,那将会很棒。 这可能吗? 一个单独但相关的问题与我在这样的方法中创建的Java实体的范围有关; 我必须手动释放上面的class , constructor或method吗? JNI文档在适当的内存管理方面令人沮丧(在我看来)。

我可以知道调用JNI C方法的类的名称吗?

有什么方法可以知道在JNI C代码中调用方法的类的名称吗? 我可以使用以下语句获取对类的引用: jclass cls = (*env)->GetObjectClass(env,obj); 但有什么办法可以知道class级的名字吗? 。

C ++和Java进程之间的共享内存

我的目标是将数据从C ++进程传递到Java进程,然后再返回结果。 我通过命名管道实现了这一点,但我更愿意共享数据而不是传递或复制数据,假设访问速度更快。 最初,我想过在C ++中创建一个可以用Java编写和读取的共享段,但我不确定这是否可以通过JNI实现,更不用说安全了。 我相信在Java中可以使用ByteBuffer.allocateDirect分配内存,然后使用GetDirectBufferAddress来访问C ++中的地址,但如果我是正确的,这是针对JNI中的本机调用,我无法在C ++进程中获取此地址? 丢失。 提前谢谢了。

使用Interface在JNI中实现回调函数

我需要使用“interface”在Java中实现回调函数。 我已经将应用程序部分编写为MyJavaFunction(int size, m_GetSizeInterface); m_GetSizeInterface是一个包含回调函数GetSize的接口。 此GetSize方法在应用程序中被覆盖。 在JNI中,我需要调用一个具有原型int MyCPPFunction(int size, int (*callback)(int* ID));的CPP函数int MyCPPFunction(int size, int (*callback)(int* ID)); 如何将此GetSize作为参数传递给JNI中的MyCPPFunction? 请帮忙 public int GetSize (m_SizeClass arg0) { g_size = arg0.size; return 0; }