- 浏览: 41518 次
- 性别:
- 来自: 济南
文章分类
最新评论
Java 和 C/C++代码的互相调用一般都是采用JNI的方法,首先Java 类 J 通过native函数调用在 对应的C++文件C中的方法,C文件保存相应的虚拟机和JNIEnv等变量,获取java类中的方法或者属性的ID,进而回调J中的方法。但有时候需要直接从C++的方法中调用java的方法,这就需要在C++代码中创建虚拟机,从而直接调用java中的代码。
#include <jni.h>
#include <stdio.h>
int main(int argc, char** argv){
JavaVM* vm;
JNIEnv* env;
JavaVMInitArgs vm_args;
vm_args.version = JNI_VERSION_1_4;
vm_args.nOptions = 0;
vm_args.ignoreUnrecognized = 1;
// Construct a VM
jint res = JNI_CreateJavaVM(&vm, (void **)&env, &vm_args);
// Construct a String
jstring jstr = env->NewStringUTF("Hello World");
// First get the class that contains the method you need to call
jclass clazz = env->FindClass("java/lang/String");
// Get the method that you want to call
jmethodID to_lower = env->GetMethodID(clazz, "toLowerCase", "()Ljava/lang/String;");
// Call the method on the object
jobject result = env->CallObjectMethod(jstr, to_lower);
// Get a C-style string
const char* str = env->GetStringUTFChars((jstring) result, NULL);
printf("%s\n", str);
// Clean up
env->ReleaseStringUTFChars(jstr, str);
// Shutdown the VM.
vm->DestroyJavaVM();
}
编译如下:
$ export LD_LIBRARY_PATH=/....../jdk1.6.0_26/jre/lib/i386/server/ #路径指向包含 libjvm.so 文件的目录
$ g++ -I/....../jdk1.6.0_26/include/ -I/....../jdk1.6.0_26/include/linux/ -L/....../jdk1.6.0_26/jre/lib/i386/server/ -ljvm main.cpp
$./a.out
即可看到程序的输出的结果
运行环境:uBuntu 10.04
#include <jni.h>
#include <stdio.h>
int main(int argc, char** argv){
JavaVM* vm;
JNIEnv* env;
JavaVMInitArgs vm_args;
vm_args.version = JNI_VERSION_1_4;
vm_args.nOptions = 0;
vm_args.ignoreUnrecognized = 1;
// Construct a VM
jint res = JNI_CreateJavaVM(&vm, (void **)&env, &vm_args);
// Construct a String
jstring jstr = env->NewStringUTF("Hello World");
// First get the class that contains the method you need to call
jclass clazz = env->FindClass("java/lang/String");
// Get the method that you want to call
jmethodID to_lower = env->GetMethodID(clazz, "toLowerCase", "()Ljava/lang/String;");
// Call the method on the object
jobject result = env->CallObjectMethod(jstr, to_lower);
// Get a C-style string
const char* str = env->GetStringUTFChars((jstring) result, NULL);
printf("%s\n", str);
// Clean up
env->ReleaseStringUTFChars(jstr, str);
// Shutdown the VM.
vm->DestroyJavaVM();
}
编译如下:
$ export LD_LIBRARY_PATH=/....../jdk1.6.0_26/jre/lib/i386/server/ #路径指向包含 libjvm.so 文件的目录
$ g++ -I/....../jdk1.6.0_26/include/ -I/....../jdk1.6.0_26/include/linux/ -L/....../jdk1.6.0_26/jre/lib/i386/server/ -ljvm main.cpp
$./a.out
即可看到程序的输出的结果
运行环境:uBuntu 10.04
发表评论
-
Android下屏保程序的开发
2014-01-09 17:08 0有时候,需要在程序中实现屏保相关的功能,如指定一段时间后,显示 ... -
Android command
2013-11-06 11:20 01. Android支持的linux command不多,在/ ... -
如何一个android工程作为另外一个android工程的lib
2013-10-19 17:01 0在实际使用中,我们可能会把一个android工程作为库,然后 ... -
Android属性(property)机制
2013-09-25 14:39 24611. 属性简介 Android里有很多属性(property ... -
Android编译系统
2013-09-23 19:07 331上次翻译了官方的Android编译系统手册(http://bl ... -
1.把我调试好的NFC上层代码加入GIT服务器代码中,并创建编译开关。
2013-08-21 09:33 0之前遇到的问题:向系统发送一个长按触摸事件,再发送其他触摸事件 ... -
2013-01-10 10:47 android多国语言使用
2013-08-12 20:57 720多国语言:在res目录下建立不同名称的values文件来调用不 ... -
android中dip px sp度量单位
2013-08-06 15:24 0目前android默认的low=120 ... -
minicom的配置
2013-07-08 09:58 5051、在使用minicom之前,首先要保证你对串口有读/写的权限 ... -
Android扩展一个硬件模块
2013-06-19 13:30 0为Android扩展一个硬件模块需要做两件事: 1、硬件和内 ... -
Android修改默认浏览器为其他浏览器
2013-06-15 10:09 1281public class MainActivity exten ... -
Android::开放root权限
2013-05-31 12:59 0开放系统root权限,即使任何用户都可以执行su程序,以使得临 ... -
android 开机logo,和开机动画
2013-05-11 23:17 0一.设置LINUX内核启动LOGO 1、让内核 ... -
android 4.0读写HID装置
2013-05-03 18:31 0求解:android 4.0读写HID设备 大家好,从3.1开 ... -
JAVA 双向SSL,SOCKET客户端/服务端
2013-03-29 14:13 901JAVA 双向SSL,SOCKET客户端/服务端 实现技术: ... -
java 面向 Socket 操作,TCP 和 UDP 示例
2013-03-21 15:55 628TCP/IP 参考模型 应用层-->传输层--> ... -
Android系统Surface制的SurfaceFlinger服务的线程模型分析
2013-03-21 11:31 542在前面两篇文章中,我们分析了SurfaceFlinge ... -
android keycode 分发
2013-03-11 16:20 0******************************* ... -
android 获得当前活动的Acticity
2013-02-25 15:17 1486ActivityManager activityManager ... -
Android 4.0 截屏(Screenshot)代码流程小结
2013-02-25 13:55 0一、基本介绍 在Android 4. ...
相关推荐
6个目标文件,EJB来模拟银行ATM机的流程及操作:获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用...
6个目标文件,EJB来模拟银行ATM机的流程及操作:获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用...
Java方法调用 什么是方法调用? Java的方法调用,有什么特殊之处? Java虛拟机调用字节码指令有哪些? 虚拟机是如何执行方法里面的字节码指令的? 解释执行 基于栈的指令集和基于寄存器的指令集 什么是基于栈的指令集? ...
Java转C++代码工具 J2C J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-OSGi R-OSGi 是一套适用于任意满足 OSGi 架构的分布式通讯组件。它以 jar 的...
Java转C++代码工具 J2C J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-OSGi R-OSGi 是一套适用于任意满足 OSGi 架构的分布式通讯组件。它以 jar 的...
Java转C++代码工具 J2C J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-OSGi R-OSGi 是一套适用于任意满足 OSGi 架构的分布式通讯组件。它以 jar 的...
当JAVA程序违反了JAVA的语义规则时,JAVA虚拟机就会将发生的错误表示为一个异常。违反语义规则包括2种情况。一种是JAVA类库内置的语义检查。例如数组下标越界,会引发IndexOutOfBoundsException;访问null的对象时会...
Java转C++代码工具 J2C J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-OSGi R-OSGi 是一套适用于任意满足 OSGi 架构的分布式通讯组件。它以 jar 的...
Java转C++代码工具 J2C J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-OSGi R-OSGi 是一套适用于任意满足 OSGi 架构的分布式通讯组件。它以 jar 的...
Java转C++代码工具 J2C J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-OSGi R-OSGi 是一套适用于任意满足 OSGi 架构的分布式通讯组件。它以 jar 的...
Java转C++代码工具 J2C J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-OSGi R-OSGi 是一套适用于任意满足 OSGi 架构的分布式通讯组件。它以 jar 的...
Java转C++代码工具 J2C J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-OSGi R-OSGi 是一套适用于任意满足 OSGi 架构的分布式通讯组件。它以 jar 的...
Java转C++代码工具 J2C J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-OSGi R-OSGi 是一套适用于任意满足 OSGi 架构的分布式通讯组件。它以 jar 的...
Java转C++代码工具 J2C J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-OSGi R-OSGi 是一套适用于任意满足 OSGi 架构的分布式通讯组件。它以 jar 的...
它是基于Java的远程方法调用(RMI)技术的,所以EJB可以被远程访问(跨进程、跨计算机)。但EJB必须被布署在诸如Webspere、WebLogic这样的容器中,EJB客户从不直接访问真正的EJB组件,而是通过其容器访问。EJB容器是...
6、实例六:在jni函数中调用java类的静态方法... 61 7、实例七:jni函数中传递基本数据类型参数... 62 8、实例八:在jni函数中传递对象类型参数... 62 9、实例九:在jni函数中处理字符串... 63 10、实例十:在...
当JAVA程序违反了JAVA的语义规则时,JAVA虚拟机就会将发生的错误表示为一个异常。违反语义规则包括2种情况。一种是JAVA类库内置的语义检查。例如数组下标越界,会引发IndexOutOfBoundsException;访问null的对象时会...
35.java除了8种基本类型外,在虚拟机里还有哪一种,有什么作用? 36.除了使用new关键字创建对象意外,试列举另外三种以上创建实例的方式? 37.classloader中,JDK的API、Classpath中的同web-inf中的class加载方式有...
Java转C++代码工具 J2C J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-OSGi R-OSGi 是一套适用于任意满足 OSGi 架构的分布式通讯组件。它以 jar 的...