这次来介绍一下,带参数和返回值的jni调用。
因为c的int你无法知道他是多少位的,可能16可能32,当然,在java平台上int总是32位的。基于这个原因,java本地接口定义了jint、jlong等类型。
boolean = jboolean 字节为1
byte = jbyte 字节为1
char = jchar 字节为2
.....
在头文件jni.h中,这些类型被typedef语句声明为在目标平台上等价的类型。该头文件也定义了常量JNI_FALSE=0,JNI_TRUE=1。
所以,当你在java层传入的int, long等类型,经过javah的转换,到下面都以
jint,
jlong的形势展现。
这里面,还有一个很常用的类型需要单独考虑,那就是string类型。
在Java中,字符串是
UTF-16编码点的序列,而c的字符串则是以null结尾的字节序列,所以这两种语言中的字符串差别很大。
Java本地接口有两组操作字符串的函数,一组把java字符串转换成“改良的UTF8”字节序列,另一组将他们转化成UTF-16数值的数组,也就是说转换成jchar数组。
JNI函数有一个有些古怪的调用约定,下面是对NewStringUTF函数的一个调用:
JNIEXPORT jstring JNICALL Java_HelloNative_getGreeting(JNIEnv* env, jclass cl){
jstring jstr;
char greeting[] = "Hello, Native World\n";
jstr = (*env)->NewStringUTF(env, greeting);
return jstr;
}
所有对JNI函数的调用都引用到了env指针,该指针是每一个本地方法的第一个参数。env指针是函数指针表的指针。所以,你必须在每个JNI调用前面加上
(*env)->,以便实际上取消对函数指针的引用。而且,env是每个JNI函数的第一个参数。
(C++注意: C++中队JNI函数的访问要简单一些。JNIEnv类的C++版本有一个内敛成员函数,它负责帮你查找函数指针,例如,你可以这样调用NEWStringUTF函数:
jstr = env->NewStringUTF(greeting);
注意,这里从该调用的参数列表里删除了JNIEnv指针。
)
接着string编码来看,两种编码的jstring编码方法,使用两个函数来得到:
NewStringUTF(JNIEnv* env, const char bytes[])和
newString(JNIEnv* env, const jchar chars[], jsize length)。
而
getStringUTF(当然UTF-16对应的是
const jchar* getStringChars()方法,后面的方法就不一一对应了,可以查资料找到)函数可以用来读取一个jstring对象的内容。该函数返回指向描述字符串的“改良UTF-8”字符的const jbyte*指针。注意,具体的
虚拟机可以自由地选择该编码来表示它内部的字符串,所以,你也许可以得到实际的JAVA字符串的字符指针。因为Java字符串是不可变的,所以慎重处理const很重要,不要试图将数据写到该字符数组中。不过,如果虚拟机使用UTF-16或UTF-32字符作为其内部字符串的表示,那么该函数会分配一个新的内存块来存储等价的“改良UTF-8”编码字符。
还有一个问题,虚拟机必须知道你何时使用完字符串,这样它就能进行垃圾回收(垃圾回收器是在一个独立线程中运行的,它能够中断本地方法的执行)。所以,我们必须调用RealeaseStringUTFChars函数。
另外,可以通过调用
GetStringRegion或
GetStringUTFRegion方法来提供你自己的缓存,来存放字符串的字符。
最后
GetStringUTFLength函数返回编码字符串所需的“改良UTF-8”字符个数。
书上有例子,有api,网上也能查到,剩下的方法就不多说了,下次分析一下这两个编码方式吧。
分享到:
相关推荐
调用iphlpapi获得本地ip信息,C++源代码演示获取ip信息的全过程。
本案例将详细讲解如何在Java中通过本地方法调用C语言实现的功能,具体以一个调用系统时间的简单例子进行说明。 首先,我们来看`TimeShow.java`这个Java类,它通常包含了一个native方法声明,例如: ```java public...
2.声明本地方法 在Java类中,使用native关键字声明本地方法。该声明告知JVM该方法将在本地库中实现,因此编译器不会为其生成字节码。例如,声明一个名为foo的本地方法: public native void foo(int x, String y); ...
本文将详细讲解如何在Android中调用JavaScript的方法,以及JavaScript如何反向调用Android本地方法。 首先,让我们从Android调用JavaScript的方法开始。Android中的WebView组件是实现这种交互的主要工具。当在...
2. JavaScriptInterface:为了使JavaScript能够调用Android的本地方法,我们需要创建一个`@JavascriptInterface`注解的接口。这个接口定义了可供JavaScript调用的方法,且这些方法会在Android运行环境中执行。 二、...
Java本地调用接口(Java Native Interface,简称JNI)是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行交互。JNI在很多场景下都扮演着关键角色,比如当需要访问操作系统特定功能、优化性能或者利用已...
注,chrome 通过注册表注册表 只能调用本地的 exe 或者bat文件,不能调用 ppt word 这样的问题,所以我用VB 写了一个exe 可以接收调用参数,这样只许注册一次就可以通过传参打开所有课执行文件了 由于1.exe是后台...
在Java编程环境中,调用本地打印机是一项常见的任务,特别是在企业级应用中,如报表生成、文档打印等场景。本文将详细讲解如何利用Java API来实现这一功能,以及可能遇到的问题和解决方案。 首先,Java提供了`java....
在"JNI本地调用4"这个主题中,我们将深入探讨JNI的使用,特别是在执行本地方法和实现Java与C/C++代码集成时的关键知识点。 1. **JNI概述**:JNI是一个接口,提供了一套API,使得Java开发者可以编写本地方法来调用非...
在IT领域,Web调用本地程序是一种常见的技术需求,它允许网页通过某种方式与用户的本地计算机进行交互,执行特定的任务。这种技术广泛应用于自动化工作流程、远程服务支持、软件更新等场景。本示例提供了实现这一...
标题提到的“Android-一个让http接口调用跟调用本地方法一样自然优雅的项目”正是为了解决这个问题,它旨在通过自动化的方式使得HTTP接口调用变得更为简洁、直观。 该项目的核心思想是将HTTP API与接口绑定,这样...
这种技术使得分布式计算成为可能,使得开发者可以构建分布式应用程序,使得客户端能够像调用本地对象一样调用远端服务器上的对象。 在RMI中,主要涉及以下几个核心概念: 1. **远程接口(Remote Interface)**:这...
RMI的核心理念是让开发者能够像调用本地方法一样调用远程对象的方法,简化了分布式系统的设计和实现。 **什么是RMI** RMI(Remote Method Invocation)是一种Java技术,它提供了在不同网络节点上的Java虚拟机之间...
JS调用Android本地方法能够利用Web技术的灵活性和原生功能的强大性,为用户提供更好的体验。本篇文章将详细介绍如何在JS通过WebView调用Android的本地方法,同时规避`addJavascriptInterface`的安全问题。 首先,...
JNI(Java Native Interface)就是为了弥补这一不足,它允许Java代码调用本地方法,这些方法通常以库文件的形式存在,如Windows上的DLL(Dynamic Link Library)或UNIX上的SO(Shared Object)文件。通过JNI,Java...
- 性能开销:远程调用涉及序列化、网络传输等操作,性能不如本地调用。 - 复杂性:实现和维护较为复杂,尤其是处理异常情况时。 #### 六、总结 RMI为Java开发者提供了一种强大的工具,用于构建分布式应用。理解RMI...
使用Python调用微信本地ocr服务.zip使用Python调用微信本地ocr服务.zip使用Python调用微信本地ocr服务.zip使用Python调用微信本地ocr服务.zip使用Python调用微信本地ocr服务.zip使用Python调用微信本地ocr服务.zip...
总的来说,Windows下浏览器调用本地应用程序的方法包括使用ActiveXObject(仅限IE)、创建.url快捷方式和注册自定义URL协议等。需要注意的是,这些方法都涉及对用户计算机的访问,因此在实际应用中必须谨慎处理,以...
"Java调用本地方法详细指南" Java Native Interface(JNI)是Java开发中的一种技术,允许Java代码调用本地方法,从而与其他语言编写的应用程序和库进行交互。JNI是Java Development Kit(JDK)的组成部分,已经被...