`
zhoucl
  • 浏览: 49919 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java中JNI的使用(三)——C/C++中调用Java的方法

    博客分类:
  • Java
阅读更多

前面两片文章主要都是自己在实验中,通过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编程(二) —— 让C++和Java相互调用(2)”显然深入探讨了如何利用JNI实现Java与C++之间的互调用。在Java应用程序中,有时为了性能优化或者利用已有的C/C++库,我们需要借助JNI来实现这种跨语言的通信。 ...

    Java中JNI的使用(一)——native

    Java中的JNI(Java Native Interface)是一种技术,允许Java代码与其他编程语言编写的代码进行交互,尤其是C和C++。JNI在许多场景下是必要的,比如访问操作系统特定的功能、提升性能或者利用已有的C/C++库。这篇博客...

    Android 学习笔记——利用JNI技术在Android中调用、调试C++代码

    这篇“Android学习笔记——利用JNI技术在Android中调用、调试C++代码”将带你深入理解如何在Android应用中使用JNI来调用C++代码,以及如何进行调试。以下是对这一主题的详细阐述。 1. **JNI简介** JNI是Java平台的...

    java调用C语言编写的so库中的函数,java调用C语言编写的dll库中的函数

    1. **创建JNI头文件**:使用`javah`工具,根据Java中的本地方法声明生成对应的C/C++头文件,其中包含了JNI函数原型。 2. **编写本地代码**:根据生成的头文件,使用C/C++编写实现这些函数的代码。这里的函数必须...

    jni例子——使用int数组

    在这个“jni例子——使用int数组”的示例中,我们将深入探讨如何在Java和C/C++之间传递和操作int数组。 1. **JNI基础知识**: - JNI接口提供了Java与本地代码(如C/C++)通信的桥梁,使得开发者可以在Java应用中...

    Java JNI调用IC卡读卡器

    JNI在很多情况下被用来调用本地库,比如C、C++编写的库,这在处理特定硬件设备或者高性能计算时非常有用。在这个场景中,我们需要通过JNI来调用IC卡读卡器的DLL(动态链接库),该DLL可能是由非Java语言编写的,以...

    Java通过调用C/C++实现的DLL动态库——JNI的方法

    在本示例中,Java程序通过JNI调用了C/C++实现的DLL(动态链接库)来执行特定的数学运算。以下是通过JNI调用DLL动态库的具体步骤和知识点: 1. **创建Java类**: 首先,我们需要在Java中创建一个类,声明native...

    安卓Android源码——代码调用C++代码和C++代码调用代码.zip

    在安卓(Android)平台上,开发...这个压缩包提供的实例涵盖了Java调用C++以及C++调用Java的全过程,对于理解Android应用中的JNI使用非常有帮助。开发者可以通过学习这些示例,掌握在实际项目中灵活运用JNI技术的方法。

    安卓Android源码——调用C++代码和C++代码调用源码.zip

    总结来说,Android调用C++代码和C++调用Java源码是通过JNI实现的,涉及到Android.mk或CMakeLists.txt的配置、JNI函数的编写以及内存管理等多个方面。正确理解和运用这些知识,能帮助开发者充分利用Android的本地层...

    JNI开发实例——锅炉压力监控器的源码

    4. **数据传输**:在JNI函数中,我们可以使用`JNIEnv`指针来访问Java对象和变量,例如,将读取到的压力值设置为Java类的成员变量,或者调用Java方法传递数据。 5. **事件处理和UI更新**:Java应用程序可能有一个...

    JNI学习示例代码,含java代码工程和win32 dll工程

    即可以在Java代码中调用C/C++等语言的代码或者在C/C++代码中调用Java代码。由于JNI是JVM规范的一部分,因此可以将我们写的JNI的程序在任何实现了JNI规范的Java虚拟机中运行。同时,这个特性使我们可以复用以前用C/...

    JNI调用及回调就(Java&C) 源码

    JNI提供了一套接口,使得Java代码可以生成本地方法调用,这些方法可以是用C或C++编写的。在Java中,我们定义一个带有`native`关键字的方法,这个方法的实现是在本地代码中完成的。然后,使用`javah`工具生成对应的C/...

    Android NDK开发——C回调Java中的方法

    在这个文件中,我们需要实现JNI函数,通过JNI函数调用Java接口的方法。首先,使用`JNIEnv*`指针获取到Java对象,然后调用Java接口的方法: ```cpp #include &lt;jni.h&gt; #include extern "C" JNIEXPORT void ...

    Android源码——调用C++代码和C++代码调用源码.zip

    3. **在C++中调用Java方法**:在C++代码中通过JNIEnv接口调用Java方法,传递回调函数指针。 4. **Java端处理回调**:Java方法接收到回调后,可以执行相应的操作。 以上是Android调用C++和C++调用Android的基本流程...

    JNI攻略之十一――启动虚拟机调用java类

    标题与描述均指向了一个具体的技术主题——通过JNI(Java Native Interface)在C语言环境中启动Java虚拟机并调用Java类。这一技术应用广泛,尤其是在需要跨语言编程或利用Java的特性(如垃圾回收、多线程)而底层...

    java调用C程序

    总之,Java调用C程序涉及的主要步骤包括编写Java类、生成JNI头文件、实现C/C++本地方法、编译C代码为动态库,最后在Java中加载并调用这些本地方法。这个过程可以让我们充分利用Java的高级特性与C/C++的性能优势。...

Global site tag (gtag.js) - Google Analytics