`
yidongkaifa
  • 浏览: 4071925 次
文章分类
社区版块
存档分类
最新评论

Android JNI基础篇

 
阅读更多
在以前的文章我们大概讲了下Android NDK的开发概况和常见的技巧,很多网友感到表示十分感兴趣发来了邮件希望继续,今天eoeAndroid还是从头还是谈论下Java的调用C++的 JNI,以便大家开发出一些功能较强大些的Android应用

1. 有关JNI的类型方法表示,很多网友不明白,下面eoeAndroid就,基本上C层面的类型均是j+java过去的类型,比如字符串在JNI的c层面为 jstring而Java为String,对于布尔类型boolean则为jboolean对应Java中的boolean。

2. 有关Java类的表示在JNI中对应关系如下

Java代码:
  1.  long cwjInfo (int nAge, String sName, int[] arrSalary);
复制代码

我们可以表示为"(ILjava/lang/String;[I)J" 我们去除双引号,第一个(表示一个参数类型,接下来的I表示第一个参数为int整形,L代表是一个类class,这里为java/lang/String 这个类,接下来是[代表是一个数组,后面的I代表一个整形的数组,而)后面的J代表返回类型,在JNI中J代表long长整形,相关的对应关系如下:

Java代码:
  1. V void
  2. Z boolean
  3. B byte
  4. C char
  5. S short
  6. I int
  7. J long
  8. F float
  9. D double
  10. L fully qualified class
  11. [ array type[]
  12. ( arg-types
复制代码

3. Java层传入的String不能在JNI中直接转化为jstring,因为Java的内部编码为unicode,中英文的字符都是每个占两个字节,而 jni中我们需要使用utf-8来表示,utf-8比较特殊中英文是不等长的,比如英文等符号的ascii占用一个字节,而中文则为三个字节,同时仍然以结尾,所以下面这种错误的方法为

Java代码:
  1. JNIEXPORT jstring JNICALL Java_Cwj_ShowLog(JNIEnv *env, jobject obj, jstring log){
  2. printf("%s", log); //这样做是错误的,printf不能直接处理Java传来的类型。
  3. //dosomething 返回jstring等等。

  4. }

复制代码

而正确的转换unicode到utf-8方法为使用GetStringUTFChars这个函数:

Java代码:

  1. JNIEXPORT jstring JNICALL Java_Cwj_ShowLog(JNIEnv *env, jobject obj, jstring log)
  2. {
  3. const jbyte *strDest;
  4. strDest = (*env)->GetStringUTFChars(env, log, NULL);
  5. if (strDest == NULL)
  6. {
  7. return NULL; //这里注意可能因为内存不足,需要抛出OutOfMemoryError异常,所以先返回空,有关JNI的异常处理Android开发网将在下面的文章中详细讲解
  8. }
  9. printf("%s", strDest);//现在strDest可以用printf显示了
  10. (*env)->ReleaseStringUTFChars(env, prompt, strDest); //strDest用完了要释放内存
  11. 接下来我们还需要返回一个jstring类型的,我们可以让用户自己输入,比如
  12. char szBuf[255]; //分配一个缓冲区
  13. scanf("%s", szBuf); //接收用户输入
  14. return (*env)->NewStringUTF(env, szBuf); //返回一个utf-8的即jstring的字符串
  15. }


复制代码

4. 在JNI中获取字符串的长度不能简单的使用strlen这样的函数,对于不同的处理我们可以通过 GetStringLength获取一个Java的unicode类型(wchar_t* )的字符串长度,或者GetStringUTFLength获取jni中的utf-8类型(char*)字符串长度。  5. 最后今天eoeAndroid给网友一个分辨处理jni还是java类型的技巧,有关jni相关的字符或字符串处理均带有utf关键字,

比如处理java的unicode类型的有:

Java代码:
  1. GetStringChars/ReleaseStringChars GetStringLength NewString GetStringRegion
复制代码
而对应jni的utf8类型的有:

Java代码:
  1. GetStringUTFChars/ReleaseStringUTFChars GetStringUTFLength NewStringUTF GetStringUTFRegion
复制代码

系列之Android JNI中级篇的帖子链接http://www.eoeandroid.com/thread-71581-1-1.html
系列之Android JNI高级篇的帖子链接http://www.eoeandroid.com/thread-71582-1-1.html
分享到:
评论

相关推荐

    JNI教程大全集,android开发必看!绝对经典!

    多部经典java JNI教程,含中文教程,网上最全的JNI资料大合集!android开发必备的资料,全面教您掌握JNI,让你在android下用C语言也可轻松开发。好不容易搜集来的资料!

    android jni开发实例

    转载几篇介绍android jni开发方法的文章,有介绍基础的,有介绍方法的,也有实例可参考。

    Android中的JNI数组操作教程

    在 Android JNI 基础知识篇提到了 Java 数组类型对应的 JNI 数组类型。比如,Java int 数组对应了 jintArray,boolean 数组对应了 jbooleanArray。 如同 String 的操作一样,JNI 提供了对应的转换函数:...

    JNI完全技术手册 带完整书签

    Chap19:JNI编程系列之基础篇... 148 System.loadLibrary("HelloWorld"); 149 JNIEXPORT void JNICALL Java_HelloWorld_print (JNIEnv *, jobject); 150 Chap20:JNI编程系列之中级篇(上)... 151 1. Java基本...

    Android 初学中阶高阶书籍_集合打包2

    段,Android 图像处理篇,Android_CTS测试研,GoogleMaps基础开发教程,Android_GPS架构分析,android_JNI编程_一些技 巧,android_jni操作指南,Android_NDK开发实例,Android_RIL层剖析(官方翻译),Android2.2+API+中文...

    Android 初学中阶高阶书籍_集合打包3

    段,Android 图像处理篇,Android_CTS测试研,GoogleMaps基础开发教程,Android_GPS架构分析,android_JNI编程_一些技 巧,android_jni操作指南,Android_NDK开发实例,Android_RIL层剖析(官方翻译),Android2.2+API+中文...

    android精品源码

    Android 图像处理篇.rar Android2.2+API+中文文档系列.pdf Android_CTS测试研究.pdf Android_GoogleMaps基础开发教程.pdf Android_GPS架构分析.doc android_jni操作指南.pdf android_JNI编程_一些技巧.doc Android_...

    《Android应用开发揭秘》附带光盘代码.

     第二部分 基础篇  第3章 Android程序设计基础  3.1 Android程序框架  3.1.1 Android项目目录结构  3.1.2 Android应用解析  3.2 Android的生命周期  3.3 Android程序U设计  3.4 小结  第4章 用户界面开发 ...

    Android应用开发揭秘pdf高清版

    第二部分 基础篇 第3章 Android程序设计基础 3.1 Android程序框架 3.1.1 Android项目目录结构 3.1.2 Android应用解析 3.2 Android的生命周期 3.3 Android程序U设计 3.4 小结 第4章 用户界面开发 4.1 用户界面开发...

    《Android应用开发揭秘》源码

     第二部分 基础篇  第3章 Android程序设计基础  3.1 Android程序框架  3.1.1 Android项目目录结构  3.1.2 Android应用解析  3.2 Android的生命周期  3.3 Android程序U设计  3.4 小结  第4章 用户界面开发 ...

    【推荐】超全的移动安全自学资料精编合集(43份).zip

    Android安全开发基础: Java本地接口(JNI) Android安全开发基础: Android系统的启动过程分析 Android安全开发基础: 图形界面(UI)和碎片(Fragment)(上) Android安全开发基础: 图形界面(UI)和碎片(Fragment...

    移动安全系列教学下载共43份.zip

    Android安全开发基础--8--Java本地接口(JNI).pdf Android安全开发基础--9--Android系统的启动过程分析.pdf Android安全软件壳--41--说说Android软件壳.pdf Android安全逆向工程--40--逆向工程知识技能补充篇.pdf ...

    《Android系统源代码情景分析》

    第1篇 初识Android系统 第1章 准备知识 1.1 Linux内核参考书籍 1.2 Android应用程序参考书籍 1.3 下载、编译和运行Android源代码 1.3.1 下载Android源代码 1.3.2 编译Android源代码 1.3.3 运行Android...

    Android音频编辑之音频转换PCM与WAV

    本篇开始讲解在Android平台上进行的音频编辑开发,首先需要对音频相关概念有基础的认识。所以本篇要讲解以下内容: 1. 常用音频格式简介 2. WAV和PCM的区别和联系 3. WAV文件头信息 4. 采样率简介 5. 声道数和...

    Android系统源代码情景分析-罗升阳-源码

    第1篇 初识Android系统 第1章 准备知识 1.1 Linux内核参考书籍 1.2 Android应用程序参考书籍 1.3 下载、编译和运行Android源代码 1.3.1 下载Android源代码 1.3.2 编译Android源代码 1.3.3 运行Android模拟器 ...

    Android系统源代码情景分析光盘

    第1篇初识Android系统 第1章 准备知识................................................................ 2 1.1 Linux内核参考书籍.................................................. 2 1.2 Android应用程序...

    OPhone平台2D游戏引擎实现——物理引擎

     上一篇文章我们介绍了常见的各种游戏特效的实现,你现在可以很轻松的实现各种游戏中所需要的特效,但是,你可能已经意识到了,我们的游戏一般都需要进行碰撞检测,比如前面的火柴棍小人,我们需要检测子弹和敌人...

Global site tag (gtag.js) - Google Analytics