- 浏览: 43534 次
- 性别:
- 来自: 济南
文章分类
最新评论
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 24991. 属性简介 Android里有很多属性(property ... -
Android编译系统
2013-09-23 19:07 360上次翻译了官方的Android编译系统手册(http://bl ... -
1.把我调试好的NFC上层代码加入GIT服务器代码中,并创建编译开关。
2013-08-21 09:33 0之前遇到的问题:向系统发送一个长按触摸事件,再发送其他触摸事件 ... -
2013-01-10 10:47 android多国语言使用
2013-08-12 20:57 742多国语言:在res目录下建立不同名称的values文件来调用不 ... -
android中dip px sp度量单位
2013-08-06 15:24 0目前android默认的low=120 ... -
minicom的配置
2013-07-08 09:58 5391、在使用minicom之前,首先要保证你对串口有读/写的权限 ... -
Android扩展一个硬件模块
2013-06-19 13:30 0为Android扩展一个硬件模块需要做两件事: 1、硬件和内 ... -
Android修改默认浏览器为其他浏览器
2013-06-15 10:09 1311public 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 935JAVA 双向SSL,SOCKET客户端/服务端 实现技术: ... -
java 面向 Socket 操作,TCP 和 UDP 示例
2013-03-21 15:55 651TCP/IP 参考模型 应用层-->传输层--> ... -
Android系统Surface制的SurfaceFlinger服务的线程模型分析
2013-03-21 11:31 579在前面两篇文章中,我们分析了SurfaceFlinge ... -
android keycode 分发
2013-03-11 16:20 0******************************* ... -
android 获得当前活动的Acticity
2013-02-25 15:17 1530ActivityManager activityManager ... -
Android 4.0 截屏(Screenshot)代码流程小结
2013-02-25 13:55 0一、基本介绍 在Android 4. ...
相关推荐
在提供的资源"使用C++创建java虚拟机JVM,使用JNI调用java函数"中,可能详细介绍了以上步骤的实际应用,包括代码示例和可能遇到的问题及解决方案。通过学习和实践这个教程,开发者可以更好地理解和掌握C++与Java之间...
- **调用Java方法**:使用`CallStaticVoidMethod`函数调用Java类的静态方法。 - **清理资源**:在所有操作完成后,使用`DestroyJavaVM`销毁Java虚拟机实例。 #### 3. 执行结果 在成功执行上述过程后,Java虚拟机将...
总的来说,通过JNI,开发者可以在C/C++代码中无缝地调用Java方法,实现两者的深度融合。然而,这种方式增加了程序的复杂性,同时也可能引入潜在的内存泄漏和线程安全问题,因此在使用时需要谨慎并做好充分的测试。
- JNI定义了一套函数,使得C/C++可以创建Java对象,调用Java方法,处理异常等。 3. **C++代码调用Java jar**: - 在C++工程(例如使用Visual Studio 2013)中,需要包含jni.h头文件,并且链接到Java的本地库。 -...
5. **加载和初始化Java虚拟机**:C++程序运行时,需要启动JVM并加载`FunCall_C2Java_Callee.jar`,然后找到并调用Java方法。 6. **调用Java函数**:使用JNI函数,如`CallVoidMethod`、`CallIntMethod`等,调用Java类...
- 通过`JNIEnv`指针,C++可以查找并调用Java对象的方法,访问字段,甚至创建新的Java对象。 8. **构建流程**: - 使用NDK(Native Development Kit)编译C/C++代码,生成.so文件。 - 将.so文件放置在项目的`jni...
这包括获取类的ID,创建Java对象,以及调用Java方法。 5. **数据类型转换**: JNI提供了Java和本地类型之间的转换。例如,将Java的`int`转换为C++的`jint`,将Java对象转换为`jobject`等。 6. **异常处理**: ...
这个头文件包含了Java方法的C/C++声明,供C++代码使用。 3. **编写C++代码**:在C++中实现本地方法。引入生成的头文件,并实现其中的方法。例如: ```cpp #include "MyNativeClass.h" JNIEXPORT void JNICALL ...
一旦本地方法加载进Java虚拟机,就可以像调用普通Java方法一样调用本地方法。Java虚拟机会自动找到本地库中的对应函数并执行。 9.处理Java和本地代码的数据类型转换 需要知道Java数据类型到本地代码数据类型的映射...
#### 示例:C++调用Java方法 考虑一个简单的示例,其中C++调用一个Java类`WinFile`的`GetFilesFromDir`方法。首先,在Java侧,`WinFile.java`文件中定义了一个`native`方法: ```java public class WinFile { ...
- 异常处理:C++代码调用Java方法时要注意处理可能抛出的异常。 - 内存管理:C++中需要手动管理内存,而Java由垃圾回收器自动管理,确保避免内存泄漏。 5. **性能优化** - 使用JNI调用C++代码可以提高性能,特别...
例如,`FindClass`用于查找Java类,`GetMethodID`用于获取Java方法的ID,`CallObjectMethod`或`CallVoidMethod`等用于实际调用Java方法。 在`C++调用JAVA方法详解.txt`中,可能详细解释了如何编写这些JNI函数,包括...
**C++调用Java方法** 1. **加载Java类:** 使用`JNIEnv`指针的`FindClass`方法,传入要查找的Java类的全名(包括包名)。 2. **获取方法ID:** 使用`GetMethodID`,需要提供类的ID、方法的签名以及方法名。方法...
这将定义C/C++函数原型,这些函数将在C++代码中实现,用于调用Java方法。 2. **编写C++代码**:在生成的头文件中,你可以看到Java方法的本地接口。在C++源文件(如`Interface.cpp`和`MyFunction.cpp`)中实现这些...
在本文中,我们将深入探讨如何在Visual Studio 2019环境下使用C++通过Java Native Interface (JNI)来调用Java代码。JNI是Java平台的一部分,它为Java应用程序提供了与本地代码交互的能力,使得开发者可以将Java应用...
在C++代码中,你需要定义一些函数,这些函数将在Java代码中被调用。为了使Java能够识别这些函数,需要使用JNI的`JNIEXPORT`和` JNICALL`宏来修饰函数声明。例如: ```cpp extern "C" { JNIEXPORT void JNICALL Java...
在C++代码中,需要将这些类型转换为本地类型,以便正确地调用Java方法和访问字段。 五、注意事项 - 确保C++和Java的编码方式一致,避免乱码问题。 - 在多线程环境中,需要正确管理JNI环境,每个线程都应有自己的...
6. **传递参数和接收结果**:在Delphi中,你可以使用上述函数,传入Java接口名、方法名以及参数,调用Java方法并获取返回值。 ```delphi const ClassName = 'com/example/MyJavaClass'; MethodName = '...
4. **处理异常**:在C++中调用Java方法时,需要检查可能出现的Java异常并适当地处理它们。 在压缩包中的示例代码中,你将看到这些步骤的实际应用,包括如何定义和实现JNI方法,以及如何在C++中调用Java代码。通过...