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

Java中JNI的使用(二)——参数传递

    博客分类:
  • Java
阅读更多

上次对JNI(Java Native Interface)调用做了个简单的介绍,在Java中调用C/C++的方法中,所有的方法都没有传递任何参数。考虑到Java和C/C++之间的String等类型的区别(具体区别请参考别的文章),通过查询JDK1.6的JNI相关api和docs的函数说明,对在方法中调用参数进行了测试,本次测试主要是jstring和char *之间的相互转换的函数:具体的转换代码如下:

char* jstringTocharStar(JNIEnv *env, jstring jstr) {
	char *rtn = NULL;
	//1、获取一个类对象
	jclass clsstring = (*env)->FindClass(env, "java/lang/String");
	//2、构造一个String对象,内容为"utf-8",作为CallObjectMethod方法中的编码字符串
	jstring strencode = (*env)->NewStringUTF(env, "utf-8");
	//3、获取对象或者接口实例的方法ID
	jmethodID mid = (*env)->GetMethodID(env, clsstring, "getBytes", "(Ljava/lang/String;)[B");
	//4、调用Call<type>Method来invoke方法getBytes(String charsetName),获取jbyteArray对象
	jbyteArray barr = (jbyteArray)(*env)->CallObjectMethod(env, jstr, mid, strencode);
	//5、返回jbyteArray对象的元素数量
	jsize alen = (*env)->GetArrayLength(env, barr);
	//6、返回一个jbyte指针对象
	jbyte *ba = (*env)->GetByteArrayElements(env, barr, JNI_FALSE);

	if(alen > 0) {
		rtn = (char*)malloc(alen + 1);
		memcpy(rtn, ba, alen);
		rtn[alen] = 0;
	}

	(*env)->ReleaseByteArrayElements(env, barr, ba, 0);
	return rtn;
}

 然后修改C/C++中相应的调用函数内容:

/*
 * Class:     org_clzps_JNICaller
 * Method:    print
 * Signature: ()V
 */
JNIEXPORT void JNICALL _Java_org_clzps_JNICaller_print
  (JNIEnv *env, jobject jobj, jstring str) {
	char * pChar = NULL;
        pChar = jstringTocharStar(env, str);
        puts(pChar);
  }

最后在Java代码中:

package org.clzps;

public class JNICaller {
	static {
		System.loadLibrary("libTestJNI");
	}
	
	public JNICaller() {}
	
	public native void print(String str);
	
}

以及:

package org.clzps;

import junit.framework.TestCase;

public class TestJNICaller extends TestCase {
	public void testCase() {
		JNICaller caller = new JNICaller();
		caller.print("你好");
	}
}
 

 

分享到:
评论

相关推荐

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

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

    jni例子——使用int数组

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

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

    至于指针参数,`JNI便捷开发框架JNA框架之指针参数Pointer(二)_cy谭的博客-CSDN博客_jna pointer.url`资源可能介绍了如何在JNA中处理指针参数,包括直接操作内存和传递结构体等复杂情况。 总的来说,Java调用...

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

    JNI,全称Java Native Interface,是Java平台...通过JNI调用DLL,设置回调机制,传递和处理二进制数据,最终实现在Java程序中控制摄像头并存储捕获的图像。这样的技术方案在许多嵌入式设备和高性能计算场景中都有应用。

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

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

    jsp,java中文乱码问题另类解决方案,jni加密、解密编码

    本篇文章将深入探讨这个问题,并提出一种另类的解决方案——利用JNI(Java Native Interface)进行加密和解密操作来规避乱码问题。 首先,我们需要理解为什么会出现中文乱码。这通常与字符编码有关,Java和JSP默认...

    java通过JNI调用dll的事例 附说明

    本教程将深入讲解如何使用Java通过JNI来调用DLL,并提供一个具体的实例——调用MessageBox函数。 首先,理解JNI的概念是至关重要的。JNI是Java平台标准的一部分,它为Java程序员提供了一种安全、高效的方式来调用...

    NDK开发——Java传递数据给C

    详情请参看我的技术博客: http://blog.csdn.net/allen315410/article/details/41845701

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

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

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

    NDK允许开发者在Android应用中混用Java和原生代码,通过JNI(Java Native Interface)来实现两者之间的交互。本篇文章将详细介绍如何在Android NDK开发中实现C回调Java中的方法。 首先,了解NDK和JNI的基础概念是...

    JavaJNI资料全整理含自己的常见问题总结.pdf

    1. **字符编码**:在JNI中传递字符串时要注意字符编码问题,默认情况下,Java使用UTF-16编码,而C/C++则通常使用ASCII或UTF-8。 2. **转换方法**:可以使用`GetStringUTFChars`和`ReleaseStringUTFChars`来获取和...

    是男人就下100层——BOX2D版 JNI代码

    JNI提供了一系列的函数,如`JNIEnv`指针,用于在Java和C++之间传递参数和返回值。 在《是男人就下100层——BOX2D版》游戏中,JNI的应用主要体现在以下几个关键点: - **物理世界初始化**:使用JNI调用C++代码,...

    JNI攻略之八――操作对象的构造方法

    #### 二、JNI中构造Java对象的步骤 ##### 1. 寻找类和方法 在JNI中构造Java对象的第一步是找到相应的Java类和构造方法。这通常通过`FindClass`和`GetMethodID`方法来实现。例如,在上述示例中,首先使用`FindClass...

    JNI学习笔记

    在JNI学习过程中,开发者还需要掌握如何传递参数和返回值,以及如何处理异常。JNI提供了丰富的函数和数据类型用于从Java到本地代码以及从本地代码返回Java的数据转换和传递。 为了更有效地使用JNI,开发者应当熟悉...

    Jnidemo-master.3.17.final.ok.rar

    1. **JNI头文件生成**:使用`javah`工具,根据Java类中声明的native方法,生成对应的C/C++头文件。这些头文件定义了Java方法在本地代码中的接口,是Java和C/C++交互的基础。 2. **本地方法实现**:在C/C++源文件中...

    AndroidJNI.rar_Android jni_android

    JNI接口定义了如何在Java和本地代码之间传递参数、执行方法以及返回结果。 在Android中,JNI的使用通常包括以下几个步骤: 1. **创建本地方法声明**:在Java源代码中,你需要声明一个native方法,并使用`JNIEXPORT...

    JNI函数使用

    传递字符串数组 参数传递 JNI调用 代码清单15-10 在Linux平台上调用C函数的例程——Sample3 public class Sample3 { public native String[] stringMethod(String text); public static void main(String[] ...

    JNI动态注册

    本文将深入探讨“JNI动态注册”这一主题,通过一个具体的例子——`RegisterNatives`的使用,来帮助你深化对JNI的理解。 首先,我们需要理解JNI的基本结构。JNI提供了一种方式,让Java代码能够调用本地(非Java)...

    安卓Andriod源码——串口开发的demo,里面包含JNI文件.zip

    在Android串口开发中,由于Java层没有直接提供串口操作API,所以我们通常会借助JNI调用C/C++库来实现串口通信功能。 3. **Android权限管理**:在Android中进行串口操作需要声明相应的权限,例如`...

Global site tag (gtag.js) - Google Analytics