iis服务器助手广告广告
返回顶部
首页 > 资讯 > 移动开发 >Android JNI开发提高篇
  • 944
分享到

Android JNI开发提高篇

jniAndroid 2022-06-06 12:06:14 944人浏览 泡泡鱼
摘要

  有关JNI的开发技术,我们继续围绕Android平台进行,JNI可以支持C或c++,从目前为止我们写过的JNI代码均为C实现的,即文件名为.C而C++的和这些有什么不同

  有关JNI的开发技术,我们继续围绕Android平台进行,JNI可以支持C或c++,从目前为止我们写过的JNI代码均为C实现的,即文件名为.C而C++的和这些有什么不同呢? Android平台上的JNI一般使用C还是C++编写呢?

  Android平台在中间层和大部分的类库的底层使用了C++的开发方式,后缀为.cpp,比如Android Framework、OpenCore、WEBkit、sqlite等等。使用C++好处是可以使用很多库但目前Android不支持STL,我们知道C表示字符串都是字符数组,但C++可以使用类似string这样的类型表示。

  1. 代码上编写C和C++有啥区别

  这里Android123以将Java的unicode字符串转为jni中的utf8,然后再返回一个jstring类型为例子,可以看到jni和java之间字符串的转换方法。

  C的实现:

  JNIEXPORT jstring JNICALL Java_Android123_CwjC (JNIEnv *env, jobject obj, jstring string)

  {

  const char *strUTF = (*env)->GetStringUTFChars(env, string, 0);

  char szBuffer[255];

  strcpy(szBuffer, strUTF);

  (*env)->ReleaseStringUTFChars(env, string, strUTF);

  return (*env)->NewStringUTF(env, szBuffer);

  }

  C++的实现:

  JNIEXPORT jstring JNICALL Java_Android123_CwjCpp (JNIEnv *env, jobject obj, jstring string)

  {

  const char *strUTF = env->GetStringUTFChars(string, 0);

  char szBuffer[255];

  strcpy(szBuffer, strUTF);

  env->ReleaseStringUTFChars(string, strUTF);

  return env->NewStringUTF(szBuffer);

  }

  我们加粗了主要区别的关键字,可以看到C++的代码更简练。

  2. JNI操作数组代码

  JNI中处理数组通用对象为jobjectArray 当然常规的类型比如整形为jintArray,布尔型为jbooleanArray,但没有出现jstringArray这样的类型,有关字符数组的处理我们将在下次的 Android JNI开发进阶篇 详细说明 。处理数组时我们需要考虑数组的长度不能为0才能继续操作,不然会有访问越界等问题,在JNI中提供了通用类型的GetArrayLength函数。我们从Java传入一个以整形数组,在JNI中将每个元素相加为例返回一个整形告诉Java运算的结果。

  JNIEXPORT jint JNICALL Java_Android123_CwjTest (JNIEnv *env, jobject obj, jintArray array)

  {

  int sum = 0;

  jsize length = (*env)->GetArrayLength(env, array); //获取数组长度

  if(length==0) //防止异常发生,如果是空的需要返回了

  return 0;

  jint *pointer = (*env)->GetIntArrayElements(env, array, 0); //获取数组指针

  for (int i=0; i

  {

  sum += pointer[i]; //相加每个数组元素

  }

  (*env)->ReleaseIntArrayElements(env, array, pointer, 0); //释放内存,这个不能忘了

  return sum;

  }


--结束END--

本文标题: Android JNI开发提高篇

本文链接: https://www.lsjlt.com/news/28610.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作