前面两片文章主要都是自己在实验中,通过Java的native关键字,调用本地的C/C++的Dll库,后面自己想那C/C++能否调用Java中的方法呢?于是网上一搜,还真有这方面的资料,于是乎动手自己也整了个小Demo,具体的原理就不多说了,直接上代码和说明:
1、编写一个Java方法,供C/C++程序调用:
package org.clzps
class HelloTest {
public HelloTest() {}
public int add(int a, int b) {
return a + b;
}
public boolean judge(boolean bl) {
return !bl;
}
}
2、通过javac,编译成HelloTest.class文件,并且通过javap -s -p HelloTest,可得到如下的结果:
Compiled from "HelloTest.java"
class org.clzps.HelloTest extends java.lang.Object{
public org.clzps.HelloTest();
Signature: ()V
public int add(int, int);
Signature: (II)I
public boolean judge(boolean);
Signature: (Z)Z
}
3、在eclipse-cpp中新建一个C工程,添加src目录,新增jniTest.c的源文件,代码如下:
#include <jni.h>
#include <stdlib.h>
#include <assert.h>
#include <stdio.h>
#include <string.h>
int main() {
JavaVMOption options[2];
JNIEnv *env;
JavaVM *jvm;
JavaVMInitArgs vm_args;
long status;
jclass cls;
jmethodID mid;
jint square;
jboolean jnot;
jobject jobj;
options[0].optionString = "-Djava.compiler=NONE";
options[1].optionString = "-Djava.class.path=.";
vm_args.version = JNI_VERSION_1_6;
vm_args.nOptions = 2;
vm_args.options = options;
vm_args.ignoreUnrecognized = JNI_TRUE;
status = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);
if(status != JNI_ERR) {
printf("create java jvm success!\n");
cls = (*env)->FindClass(env, "org/clzps/HelloTest");
if(cls != 0) {
printf("find java class success!\n");
//构造函数
mid = (*env)->GetMethodID(env, cls, "<init>", "()V");
if(mid != 0) {
jobj = (*env)->NewObject(env, cls, mid);
printf("init ok\n");
}
//调用add函数
mid = (*env)->GetStaticMethodID(env, cls, "add", "(II)I");
if(mid != 0) {
square = (*env)->CallStaticIntMethod(env, cls, mid, 5, 5);
printf("5+5 = %d\n", (int)square);
} else {
printf("error\n");
}
//调用judge函数
mid = (*env)->GetMethodID(env, cls, "judge", "(Z)Z");
if(mid != 0) {
jnot = (*env)->CallBooleanMethod(env, jobj, mid, JNI_TRUE);
if(!jnot) {
printf("Boolean Ok!\n");
}
}
} else {
printf("find java class failed!\n");
}
return 1;
} else {
printf("create java jvm failed!\n");
return -1;
}
}
由于需要用到Java中的内容,以及虚拟机等,因此需要在工程进行相应的配置,这里环境是Eclipse IDE for C/C++ Developers,配置如下:
1、选择项目-->properties-->C++ General-->Paths and Symbols;
2、Includes-->GNU C,右侧添加JDK_HOME/include和JDK_HOME/include/win32;
3、Libraries选项卡下,jvm;
4、Libraries Paths下,添加:JDK_HOME/lib;
然后,将org.clzps.HelloTest.class复制到C项目下
4、最后运行Build Project,然后Run,结果如下所示:
create java jvm success!
find java class success!
init ok
5+5 = 10
Boolean Ok!
至此,C/C++调用Java方法成功,仅作自己实验记录,希望能对和我一样刚刚开始学习JNI的人有所帮助!~~
分享到:
相关推荐
这篇博客“JNI编程(二) —— 让C++和Java相互调用(2)”显然深入探讨了如何利用JNI实现Java与C++之间的互调用。在Java应用程序中,有时为了性能优化或者利用已有的C/C++库,我们需要借助JNI来实现这种跨语言的通信。 ...
Java中的JNI(Java Native Interface)是一种技术,允许Java代码与其他编程语言编写的代码进行交互,尤其是C和C++。JNI在许多场景下是必要的,比如访问操作系统特定的功能、提升性能或者利用已有的C/C++库。这篇博客...
这篇“Android学习笔记——利用JNI技术在Android中调用、调试C++代码”将带你深入理解如何在Android应用中使用JNI来调用C++代码,以及如何进行调试。以下是对这一主题的详细阐述。 1. **JNI简介** JNI是Java平台的...
1. **创建JNI头文件**:使用`javah`工具,根据Java中的本地方法声明生成对应的C/C++头文件,其中包含了JNI函数原型。 2. **编写本地代码**:根据生成的头文件,使用C/C++编写实现这些函数的代码。这里的函数必须...
JNI在很多情况下被用来调用本地库,比如C、C++编写的库,这在处理特定硬件设备或者高性能计算时非常有用。在这个场景中,我们需要通过JNI来调用IC卡读卡器的DLL(动态链接库),该DLL可能是由非Java语言编写的,以...
在这个“jni例子——使用int数组”的示例中,我们将深入探讨如何在Java和C/C++之间传递和操作int数组。 1. **JNI基础知识**: - JNI接口提供了Java与本地代码(如C/C++)通信的桥梁,使得开发者可以在Java应用中...
在本示例中,Java程序通过JNI调用了C/C++实现的DLL(动态链接库)来执行特定的数学运算。以下是通过JNI调用DLL动态库的具体步骤和知识点: 1. **创建Java类**: 首先,我们需要在Java中创建一个类,声明native...
在安卓(Android)平台上,开发...这个压缩包提供的实例涵盖了Java调用C++以及C++调用Java的全过程,对于理解Android应用中的JNI使用非常有帮助。开发者可以通过学习这些示例,掌握在实际项目中灵活运用JNI技术的方法。
总结来说,Android调用C++代码和C++调用Java源码是通过JNI实现的,涉及到Android.mk或CMakeLists.txt的配置、JNI函数的编写以及内存管理等多个方面。正确理解和运用这些知识,能帮助开发者充分利用Android的本地层...
4. **数据传输**:在JNI函数中,我们可以使用`JNIEnv`指针来访问Java对象和变量,例如,将读取到的压力值设置为Java类的成员变量,或者调用Java方法传递数据。 5. **事件处理和UI更新**:Java应用程序可能有一个...
即可以在Java代码中调用C/C++等语言的代码或者在C/C++代码中调用Java代码。由于JNI是JVM规范的一部分,因此可以将我们写的JNI的程序在任何实现了JNI规范的Java虚拟机中运行。同时,这个特性使我们可以复用以前用C/...
JNI提供了一套接口,使得Java代码可以生成本地方法调用,这些方法可以是用C或C++编写的。在Java中,我们定义一个带有`native`关键字的方法,这个方法的实现是在本地代码中完成的。然后,使用`javah`工具生成对应的C/...
在这个文件中,我们需要实现JNI函数,通过JNI函数调用Java接口的方法。首先,使用`JNIEnv*`指针获取到Java对象,然后调用Java接口的方法: ```cpp #include <jni.h> #include extern "C" JNIEXPORT void ...
3. **在C++中调用Java方法**:在C++代码中通过JNIEnv接口调用Java方法,传递回调函数指针。 4. **Java端处理回调**:Java方法接收到回调后,可以执行相应的操作。 以上是Android调用C++和C++调用Android的基本流程...
标题与描述均指向了一个具体的技术主题——通过JNI(Java Native Interface)在C语言环境中启动Java虚拟机并调用Java类。这一技术应用广泛,尤其是在需要跨语言编程或利用Java的特性(如垃圾回收、多线程)而底层...
总之,Java调用C程序涉及的主要步骤包括编写Java类、生成JNI头文件、实现C/C++本地方法、编译C代码为动态库,最后在Java中加载并调用这些本地方法。这个过程可以让我们充分利用Java的高级特性与C/C++的性能优势。...