- 浏览: 929260 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
itzhongyuan:
java Random类详解 -
david_je:
你好,我看到你在C里面回调JAVA里面的方法是在native里 ...
Android NDK开发(1)----- Java与C互相调用实例详解 -
fykyx521:
请求锁是在 oncreate 释放实在ondestroy?? ...
Android如何保持程序一直运行 -
aduo_vip:
不错,总结得好!
Android读取assets目录下的资源 -
f839903061:
给的网址很给力哦!
Android 4.0.1 源码下载,编译和运行
直接看代码吧
public class Prompt{ public native String getLine(String prompt); //声明本地方法 public static void main(String[] args) { Prompt p = new Prompt(); String input = p.getLine("Type a line:"); // System.out.println(System.getProperty("java.library.path")); System.out.println("User typed: " + input); } static{ //System.loadLibrary("helloworld"); // 加载库文件 System.load("/Users/zhaoshun/solibs/libhelloStr.so"); } } /** * * 头文件中的方法原型 * Class: jni_sample_Prompt * Method: getLine * Signature: (Ljava/lang/String;)Ljava/lang/String; * JNIEXPORT jstring JNICALL Java_jni_sample_Prompt_getLine * (JNIEnv *, jobject, jstring); * * Java_Prompt_getLine接收3个参数: JNIEnv结构包括JNI函数表。 * 第二个参数的意义取决于该方法是静态还是实例方法(static or an instance method)。 * 当本地方法作为一个实例方法时,第二个参数相当于对象本身,即this. 当本地方法作为 一个(static类型的方法)静态方法时,指向所在类. * 在本例中,Java_Prompt_getLine是一个本地实例方法实现, 所以jobject 指向对象本身。 * Java Native(jni.h) boolean jboolean byte jbyte char jchar short jshort int jint long jlong float jfloat double jdouble 相比基本类型,对象类型的传递要复杂很多。 Java层对象作为opaque references(指 针)传递到JNI层。 Opaque references是一种C的指针类型,它指向JavaVM内部数据结构。 使用这种指针的目的是:不希望JNI用户了解JavaVM内部数据结构。 对Opaque reference 所指结构的操作,都要通过JNI方法进行. 比如,"java.lang.String"对象,JNI层对应的 类型为jstring, 对该opaque reference的操作要通过JNIEnv->GetStringUTFChars进行。 一定要按这种原则编程,千万不要为了效率或容易的取到某个值,绕过 JNI,直接操作 opaque reference. JNI 是一套完善接口,所有需求都能满足。 在JNI中对象的基类即为jobject. 为方便起见,还定义了jstring,jclass, jobjectArray 等结构,他们都继承自 jobject。 使用对应的 JNI 函数把 jstring 转成 C/C++字串。JNI 支持 Unicode/UTF-8 字符编码互转。 Unicode 以 16-bits 值编码;UTF-8 是一种以字节为单位变长格式的字符编码,并与 7-bits ASCII码兼容。 UTF-8字串与C字串一样,以NULL('\0')做结束符, 当UTF-8包含非ASCII 码字符时,以'\0'做结束符的规则不变。 7-bit ASCII字符的取值范围在1-127之间,这些 字符的值域与 UTF-8 中相同。当最高位被设置时,表示多字节编码。 如下,调用 GetStringUTFChars,把一个 Unicode 字串转成 UTF-8 格式字串,如果你确定 字串只包含7-bit ASCII字符。 这个字串可以使用C库中的相关函数,如printf. * */
#include <jni.h> #include <stdio.h> #include "Prompt.h" // printf 在stdio.h头文件中 JNIEXPORT jstring JNICALL Java_jni_sample_Prompt_getLine (JNIEnv *env, jobject obj, jstring prompt) { char buf[128]; const jbyte *str; str = (*env)->GetStringUTFChars(env,prompt,NULL); if(str == NULL){ return NULL; /* OutOfMemoryError already thrown */ } printf("%s",str); (*env)->ReleaseStringUTFChars(env, prompt, str); /* We assume here that the user does not type more than * 127 characters */ scanf("%127s",buf); return (*env)->NewStringUTF(env, buf); } /*** 记得检测 GetStringUTFChars 的返回值,因为调用该函数会有内存分配操作,失败后,该 函数返回 NULL,并抛 OutOfMemoryError 异常。 如何处理异常,后面会有介绍。JNI 处理异常,不同于 Java 中的 try...catch。在 JNI 中, 发生异常,不会改变代码执行轨迹,所以,当返回 NULL,要及时返回,或马上处理异常。 调用ReleaseStringUTFChars释放GetStringUTFChars中分配的内存(Unicode -> UTF-8 转换的原因)。 使用 JNIEnv->NewStringUTF 构造 java.lang.String;如果此时没有足够的内存, NewStringUTF 将抛 OutOfMemoryError 异常,同时返回 NULL。 除了GetStringUTFChars, ReleaseStringUTFChars, 和NewStringUTF, JNI还支持其他 操作 String 的函数供使用。 GetStringChars 是有 Java 内部 Unicode 到本地 UTF-8 的转换函数,可以调用 GetStringLength,获得以 Unicode 编码的字串长度。也可以使用 strlen 计算 GetStringUTFChars 的返回值,得到字串长度。 const jchar * GetStringChars(JNIEnv *env, jstring str, jboolean *isCopy); 上述声明中,有 isCopy 参数,当该值为 JNI_TRUE,将返回 str 的一个拷贝;为 JNI_FALSE将直接指向str的内容。 注意:当isCopy为JNI_FALSE,不要修改返回值,不 然将改变 java.lang.String 的不可变语义。 一般会把isCopy设为NULL,不关心Java VM对返回的指针是否直接指向 java.lang.String 的内容。 记住在调用 GetStringChars 之后,要调用 ReleaseStringChars 做释放,不管在调用 GetStringChars 时为 isCopy 赋值 JNI_TRUE 还是 JNI_FALSE,因不同 JavaVM 实现的原因, ReleaseStringChars 可能释放内存,也可能释放一个内存占用标记(isCopy 参数的作用,从 GetStringChars 返回一个指针,该指针直接指向 String 的内容,为了避免该指针指向的内 容被 GC,要对该内存做锁定标记)。 JNIEXPORT jstring JNICALL Java_Prompt_getLine(JNIEnv *env, jobject obj, jstring prompt) { char outbuf[128], inbuf[128]; int len = (*env)->GetStringLength(env, prompt); (*env)->GetStringUTFRegion(env, prompt, 0, len, outbuf); printf("%s", outbuf); scanf("%s", inbuf); return (*env)->NewStringUTF(env, inbuf); } GetStringUTFRegion有两个参数,starting index 和 length, 这两个参数以Unicode编 码计算. 该函数会做边界检查,所以可能抛出StringIndexOutOfBoundsException。 因为该函数不涉及内存操作,所以较 GetStringUTFChars 使用要简单。 有两个函数:GetStringLength/GetStringUTFLength,前者是 Unicode 编码长度,后者 是 UTF 编码长度。 GetStringUTFRegion 很有用,因为你不能修改 GetStringUTFChars 返回值,所以需要另 外 malloc/strcpy 之后,再操作返回值,耗时费力,不如直接使用 GetStringUTFRegion 来 的简洁、高效。 */
发表评论
-
cocos2dx中利用xcode 调用java中的函数
2013-07-29 11:36 25251. 先把cocos2dx根目录中的 /Users/zhaos ... -
Java中HashMap遍历的两种方式
2013-07-23 13:58 996转]Java中HashMap遍历的两种方式 原文地址: htt ... -
Android.mk的用法和基础
2013-07-19 14:11 4332一个Android.mk file用来向编译系统描述你的源代码 ... -
eclipse配置NDK-Builder命令
2013-07-18 11:02 10351. 2. -
eclipse配置javah命令
2013-07-18 10:48 19931.找到javah命令所在的目录 我的为 /usr/bi ... -
Android SDL2.0 编译
2013-07-17 13:40 19671,下载: wget http://www.libsdl.o ... -
Ubuntu安装JDK6和JDK5
2013-05-19 19:04 1007sudo apt-get install sun-java6- ... -
JNI详解001_c++
2013-05-09 14:57 817public class HelloWorld { p ... -
java_jni详解_04
2013-05-09 14:13 1123public class ObjectArrayTest{ ... -
jni docs
2013-05-09 12:18 886http://docs.oracle.com/javase/1 ... -
java_jni详解_03
2013-05-09 11:55 1035直接看代码 public class I ... -
java_jni详解_01
2013-05-08 17:15 957java中的jni 例子HelloWorld 准备过程: 1 ... -
Android with the NDK_001
2013-05-08 09:22 11241.设置环境 Microsoft Windows 系统下 ... -
Android NDK 的学习之旅-----JNI LOG 打印
2013-05-08 09:23 23231.创建android 工程 android create p ... -
Android NDK 的学习之旅-----HelloWorld
2013-05-08 09:22 8801.在 ndk sample目录下创建 项目 android ... -
Android NDK开发(1)----- Java与C互相调用实例详解
2013-05-07 15:42 2499一、概述 对于大部分应用开发者来说可能都不怎么接 ... -
Unable to execute dex: Java heap space 解决方案
2012-10-31 16:01 1221整理一下,网上提供两种方法: 1、eclip ... -
Java编译错误“No enclosing instance of type
2012-06-15 16:14 1272Java编译错误“No enclosing instance ... -
打第三方jar包
2012-06-11 11:03 1148方法一:(工程没有引用外部jar包时,直接导出) 选中工程 ... -
常用的System.getProperty()
2012-05-20 10:24 989public class TestSystemproperty ...
相关推荐
### Java与JNI结合获取系统进程信息的实现 #### 概述 在《Java_JNI_获得系统进程信息实例.doc》中,我们探索了一个利用Java Native Interface (JNI)来获取操作系统进程信息的示例项目。该项目由三个主要部分组成:`...
在Android开发中,JNI(Java Native Interface)是一个关键的技术,它允许Java代码和其他语言写的代码进行交互。JNI在很多场景下都非常有用,比如优化性能、使用现有的C/C++库、或者像在这个“JniCallback.zip”文件...
《Android JNI串口通信实践详解》 在移动设备开发领域,Android系统因其开源特性与丰富的功能,成为开发者们的首选平台。然而,对于某些特定的硬件交互,如串口通信(RS232),原生Java API往往无法满足需求,这时...
### Java JNI 编程进阶知识点详解 #### 一、JNI技术概述 JNI(Java Native Interface,Java本地接口)是一种框架,它允许Java代码与其他语言(如C、C++)编写的代码进行交互。这种交互能力对于提升Java应用程序的...
LTP4J的核心在于其提供的静态库(parser_jni.lib)和动态库(如parser_jni.dll),这些库文件是C++编写的底层实现,通过JNI(Java Native Interface)技术与Java代码进行交互。JNI允许Java代码直接调用C/C++的函数,...
在JNI详解与实现的PDF文档中,可能会涵盖以下几个主要知识点: 1. **JNI基础知识**:介绍JNI的概念,它的历史,以及为何需要使用JNI。这通常包括Java平台的结构,如何在Java中创建本地方法,以及JNI头文件和库的...
《Android NDK与JNI开发详解:从Hello-JNI入门》 Android系统以其开源性和灵活性吸引了大量的开发者,而JNI(Java Native Interface)则是Android平台中连接Java层与原生C/C++代码的重要桥梁。JNI允许开发者在...
Java调用JNI详解 Java Native Interface(JNI)是Java虚拟机(JVM)与native代码之间的接口,允许Java程序调用native代码,反之亦然。本文将详细介绍如何使用Java的JNI调用C++的DLL包。 JNI的作用 JNI的主要作用...
### Android深入研究JNI详解 #### 一、JNI与Android中的.so库载入 在深入了解JNI(Java Native Interface)之前,我们需要明确一点:Android应用程序的主要部分是基于Java开发的,并且这些Java类会被编译成Dex格式...
《Android NDK与JNI开发详解:HelloNDK实践》 Android Native Development Kit(NDK)是Google提供的一款工具集,允许开发者在Android平台上使用C/C++编写原生代码,从而提高应用程序的性能和效率。JNI(Java ...
`libusb`是一个开源的C库,用于跨平台的USB编程,而JNI(Java Native Interface)则是Java平台的一部分,用于连接Java代码与本地(非Java)代码,如C或C++。将`libusb`与JNI结合,开发者可以编写Java应用,同时利用`...
【JNI技术详解】 JNI(Java Native Interface)是Java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI在Android开发中扮演着重要的角色,尤其是当开发者需要利用C/C++库或者提高性能时。本教程将围绕...
《Android平台上的JNI与avilib库的整合应用详解》 在Android开发中,JNI(Java Native Interface)是一种关键的技术,它允许Java代码与其他语言(如C++)进行交互,为高性能计算、系统调用或者利用已有的C/C++库...
#### 三、JNI的工作流程详解 根据给定的文件内容,我们可以深入探讨一个简单的JNI示例,该示例展示了如何创建一个Java类,以及如何使用JNI调用C语言编写的函数。 1. **创建Java类** ```java package cn; public ...
Android 深入研究 JNI 详解 JNI(Java Native Interface)是 Java 平台的一部分,允许 Java 代码和其他语言编写的代码进行交互。JNI 是本地编程接口,使得在 Java 虚拟机(VM)内部运行的 Java 代码能够与用其他...
5本JNI资料,非常详细; 1.android_jni操作指南.pdf 2.JNI设计实践之路.pdf 3.jni详解.pdf 4.Java_JNI_编程进阶.pdf 5.Android_JNI总结.doc
### 有关Java JNI详解 #### 一、JNI概述与重要性 Java Native Interface(JNI)是一种重要的技术,它允许Java代码与其他语言(主要是C和C++)编写的代码进行交互。这种交互能力使得开发者能够在利用Java平台的强大...
### JNI详解:深入理解Java Native Interface #### 一、引言与翻译初衷 JNI(Java Native Interface)作为连接Java世界与本地C/C++世界的桥梁,其重要性不容小觑。本文旨在详细介绍Android环境下JNI的使用,帮助...
### Android JNI 操作指南知识点详解 #### 一、概述 JNI (Java Native Interface) 是 Java 平台标准的一部分,它允许 Java 代码和其他语言写的代码进行交互。在 Android 开发中,通过 NDK (Native Development Kit)...