Tag: jni

JNI FindClass格式的子类?

加载子类的正确FindClass标识语法是什么? 例如: package abc; class Foo { class Bar { … } } 为了得到Foo我可以做(*env)->FindClass(env, “/a/b/c/Foo”) ,但试图通过(*env)->FindClass(env, “a/b/c/Foo/Bar”)抛出ClassNotFoundException 。 是否有不同的语法来表示子类?

非阻塞文件读取

java中是否有非阻塞文件读取API? 如果不是,用C ++构建一个并通过JNI从Java应用程序调用它是否明智?

如何在JNI中将指针从java传递给C?

我有一个本地方法int sum(int *,int *)如何从java端传递此方法的参数。 编辑:我成功运行的示例方法是double gsl_stats_mean(doubleArray,int,int); 这个方法在GSL中可用,因为我创建了共享对象,并且从java方面我已经发送了所需的参数,并且我得到了double作为返回值。

用户按下该键时无法看到该消息

下面的java程序在C中调用一个本机方法,它应该打印you pressed a key !的消息you pressed a key ! 如果用户按下一个键。 但我无法看到消息,因为我按下了键。我还检查函数SetWindowsHookEx返回null但不是,它不返回null。 Java代码: package keylogger; public class TestKeys { private native void setWinHook(); public static void main(String args[]) { TestKeys o = new TestKeys(); try { o.setWinHook(); Thread.sleep(10000); } catch(Exception exc) { exc.printStackTrace(); } } static { System.loadLibrary(“MyHook”); } C代码: #include #include #include #include “keylogger_TestKeys.h” static […]

重点关注JDK7和本机组件的问题

我们有一个swing应用程序,它通过JNIWrapper嵌入IE ocx组件。 从jdk6切换到jdk7后,我们开始注意焦点问题。 当嵌入式IE显示带有文本字段的网页(例如谷歌搜索页面)而不是麻烦开始时: 浏览器“捕获”焦点,因此您可以开始在搜索文本字段中输入内容。 键入的每个键都进入IE ocx。 但是,摆动似乎忽略了这种焦点变化。 即使我将焦点更改为swing文本字段(并且swing显示闪烁的输入光标),所有键入的键都会转到IE ocx “修复”焦点的唯一方法是取消激活并激活主框架。 之后,焦点似乎是一致的。 但是,如果我再次点击谷歌搜索文本字段,焦点将再次被打破。 似乎jdk7中的焦点处理有很大的变化。 从链接 : 在Windows平台上,已经实现了“合成焦点”的概念。 这意味着焦点所有者组件仅模拟其可聚焦状态,而实际本机焦点设置为“焦点代理”组件。 此组件接收键和输入方法本机消息,并将它们分派给焦点所有者。 在JDK7之前,焦点代理组件是框架/对话框内的专用隐藏子组件。 在JDK7中,框架/对话框本身用作焦点代理。 现在,它代理不仅关注拥有窗口中的组件,还关注所有子组件。 一个简单的窗口永远不会接收本机焦点,并依赖于其所有者的焦点代理。 此机制对用户是透明的,但在调试时应予以考虑。 任何人都有想法“修复”这种行为? 编辑 :这里有一些代码用JxBrowser重现问题 public static void main(String[] args) { Browser browser = BrowserFactory.createBrowser(BrowserType.IE); JFrame frame = new JFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.getContentPane().add(browser.getComponent(), BorderLayout.CENTER); JPanel panel = new JPanel(); frame.getContentPane().add(panel, BorderLayout.NORTH); textField = new […]

通过JNI获取Java ByteBuffer的指针

如何获得指向Java ByteBuffer内部数组的指针? JNIEXPORT void JNICALL test(JNIEnv *env, jobject thiso) { jclass cls = env->FindClass(“java/nio/ByteBuffer”); jmethodID aloc = env->GetStaticMethodID(cls, “allocateDirect”, “(I)Ljava/nio/ByteBuffer;”); jobject obj = env->CallStaticObjectMethod(cls, aloc, 1000); } PS:我这样做是为了分享Java和C ++使用的内存。

C ++应用程序可以使用JNI加载.jar文件吗?

谢谢你看看问题。 我试图使用JNI接口调用类文件中的java方法。 反过来,被调用的类文件应该执行另一个驻留在同一个目录中的.jar文件? 我很难实现这一点,但我没有成功执行.jar文件。 我的意思是我无法从.jar文件中获得类fuile的结果。 任何人都可以解释一下,是否可以这样做,或者我应该寻找另一种选择? 代码是这样的: class JNIInterface { private: JavaVMInitArgs vm_args; JavaVM *jvm; JNIEnv *env; long result; jmethodID mid; jfieldID fid; jobject jobj; jclass cls; int asize; char JVMOptionString[20]; char className[20]; char methodName[20]; JavaVMOption options[1]; public: JNIInterface(char* JVMOptionString) { // JavaVMOption options[1]; options[0].optionString = JVMOptionString; vm_args.options = options; vm_args.nOptions = 1; vm_args.version = […]

如何让Swig正确地将在C中修改的char *缓冲区包装为Java Something-other?

我正在尝试包装一些用于Java的遗留代码,我很高兴看到Swig能够处理头文件并生成一个几乎可以工作的好包装器。 现在我正在寻找能让它真正发挥作用的深刻魔法。 在CI中有一个看起来像这样的function DLL_IMPORT int DustyVoodoo(char *buff, int len, char *curse); 此函数返回的此整数是一个错误代码,以防它失败。 争论是 buff是一个字符缓冲区 len是缓冲区中数据的长度 curse另一个包含调用DustyVoodoo结果的字符缓冲区 所以,你可以看到它的发展方向,结果实际上是通过第三个参数返回的。 len也是令人困惑的,因为它可能是两个缓冲区的长度,它们总是在调用代码中被分配为相同的大小,但是考虑到DustyVoodoo我不认为它们需要相同。 为了安全起见,两个缓冲区在实践中应该是相同的大小,比如512个字符。 为绑定生成的C代码如下: SWIGEXPORT jint JNICALL Java_pemapiJNI_DustyVoodoo(JNIEnv *jenv, jclass jcls, jstring jarg1, jint jarg2, jstring jarg3) { jint jresult = 0 ; char *arg1 = (char *) 0 ; int arg2 ; char *arg3 = (char *) 0 […]

将java函数注册为C函数中的回调函数

我试图使用SWIG 1.3在Java中实现一些C代码。 现在我必须将一些现有的C重建为Java代码,并为C方法提供指向Java函数的函数指针。 C代码:net.c: void register_message_handler( context_t *ctx, message_handler_t handler) { context->msg_handler = (void (*)( void *, coap_queue_t *, void *)) handler; } client.c: void message_handler(context_t *ctx, queue_t *node, void *data) { … } int main(int argc, char **argv) { // setup ctx register_message_handler( ctx, message_handler ); } 我在Java中已经拥有的是: public static void message_handler(def.SWIGTYPE_p_context_t ctx, def.SWIGTYPE_p_queue_t […]

通过JNI传递C和Java之间的指针

我一直在通过JNI在Java中存储c指针,遵循@tulskiy的建议在这篇文章中通过JNI传递C和Java之间的指针 诀窍是将指针转换为jlong​​。 所以从c我有return (jlong) ptr; 我正在返回一个jlong​​(总是64位),因为我希望我的代码可以在64位和32位系统上运行。 64位计算机上64位指针的内存大小为64,因此在32位计算机上,内存中指针的大小为32位。 问题是在32位机器上我得到一个编译器警告说“从不同大小的指针转换为整数”。 如果我有return (jlong) (int32_t) ptr;警告就会消失return (jlong) (int32_t) ptr; 但是这个代码不适合64位机器。 我希望我的代码编译时没有警告,这样如果有合法的警告,我会看到它。 有人有主意吗? 谢谢,本