上次对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("你好");
}
}
分享到:
相关推荐
4. **数据传输**:在JNI函数中,我们可以使用`JNIEnv`指针来访问Java对象和变量,例如,将读取到的压力值设置为Java类的成员变量,或者调用Java方法传递数据。 5. **事件处理和UI更新**:Java应用程序可能有一个...
在这个“jni例子——使用int数组”的示例中,我们将深入探讨如何在Java和C/C++之间传递和操作int数组。 1. **JNI基础知识**: - JNI接口提供了Java与本地代码(如C/C++)通信的桥梁,使得开发者可以在Java应用中...
至于指针参数,`JNI便捷开发框架JNA框架之指针参数Pointer(二)_cy谭的博客-CSDN博客_jna pointer.url`资源可能介绍了如何在JNA中处理指针参数,包括直接操作内存和传递结构体等复杂情况。 总的来说,Java调用...
JNI,全称Java Native Interface,是Java平台...通过JNI调用DLL,设置回调机制,传递和处理二进制数据,最终实现在Java程序中控制摄像头并存储捕获的图像。这样的技术方案在许多嵌入式设备和高性能计算场景中都有应用。
标题与描述均指向了一个具体的技术主题——通过JNI(Java Native Interface)在C语言环境中启动Java虚拟机并调用Java类。这一技术应用广泛,尤其是在需要跨语言编程或利用Java的特性(如垃圾回收、多线程)而底层...
本篇文章将深入探讨这个问题,并提出一种另类的解决方案——利用JNI(Java Native Interface)进行加密和解密操作来规避乱码问题。 首先,我们需要理解为什么会出现中文乱码。这通常与字符编码有关,Java和JSP默认...
本教程将深入讲解如何使用Java通过JNI来调用DLL,并提供一个具体的实例——调用MessageBox函数。 首先,理解JNI的概念是至关重要的。JNI是Java平台标准的一部分,它为Java程序员提供了一种安全、高效的方式来调用...
详情请参看我的技术博客: http://blog.csdn.net/allen315410/article/details/41845701
这篇“Android学习笔记——利用JNI技术在Android中调用、调试C++代码”将带你深入理解如何在Android应用中使用JNI来调用C++代码,以及如何进行调试。以下是对这一主题的详细阐述。 1. **JNI简介** JNI是Java平台的...
NDK允许开发者在Android应用中混用Java和原生代码,通过JNI(Java Native Interface)来实现两者之间的交互。本篇文章将详细介绍如何在Android NDK开发中实现C回调Java中的方法。 首先,了解NDK和JNI的基础概念是...
1. **字符编码**:在JNI中传递字符串时要注意字符编码问题,默认情况下,Java使用UTF-16编码,而C/C++则通常使用ASCII或UTF-8。 2. **转换方法**:可以使用`GetStringUTFChars`和`ReleaseStringUTFChars`来获取和...
JNI提供了一系列的函数,如`JNIEnv`指针,用于在Java和C++之间传递参数和返回值。 在《是男人就下100层——BOX2D版》游戏中,JNI的应用主要体现在以下几个关键点: - **物理世界初始化**:使用JNI调用C++代码,...
#### 二、JNI中构造Java对象的步骤 ##### 1. 寻找类和方法 在JNI中构造Java对象的第一步是找到相应的Java类和构造方法。这通常通过`FindClass`和`GetMethodID`方法来实现。例如,在上述示例中,首先使用`FindClass...
在JNI学习过程中,开发者还需要掌握如何传递参数和返回值,以及如何处理异常。JNI提供了丰富的函数和数据类型用于从Java到本地代码以及从本地代码返回Java的数据转换和传递。 为了更有效地使用JNI,开发者应当熟悉...
1. **JNI头文件生成**:使用`javah`工具,根据Java类中声明的native方法,生成对应的C/C++头文件。这些头文件定义了Java方法在本地代码中的接口,是Java和C/C++交互的基础。 2. **本地方法实现**:在C/C++源文件中...
JNI接口定义了如何在Java和本地代码之间传递参数、执行方法以及返回结果。 在Android中,JNI的使用通常包括以下几个步骤: 1. **创建本地方法声明**:在Java源代码中,你需要声明一个native方法,并使用`JNIEXPORT...
传递字符串数组 参数传递 JNI调用 代码清单15-10 在Linux平台上调用C函数的例程——Sample3 public class Sample3 { public native String[] stringMethod(String text); public static void main(String[] ...
本文将深入探讨“JNI动态注册”这一主题,通过一个具体的例子——`RegisterNatives`的使用,来帮助你深化对JNI的理解。 首先,我们需要理解JNI的基本结构。JNI提供了一种方式,让Java代码能够调用本地(非Java)...
在Android串口开发中,由于Java层没有直接提供串口操作API,所以我们通常会借助JNI调用C/C++库来实现串口通信功能。 3. **Android权限管理**:在Android中进行串口操作需要声明相应的权限,例如`...