1、基本类型应用

对于JNI处理基本类型还是比较简单的,下面是Java代码:
<span style="font-size:14px;"> public native int intMethod(int n);

 public native boolean booleanMethod(boolean bool);</span>

上面的方法是在Java中写的,注意要加native关键字,这两个方法都比较简单,分别传入int ,boolean类型到jni中,经过处理返回。下面是jni的代码:

<span style="font-size:14px;">JNIEXPORT jint JNICALL Java_com_example_jniandroid_service_SimpleObject_intMethod(
JNIEnv * env, jobject obj, jint val) {
return val * val;
} JNIEXPORT jboolean JNICALL Java_com_example_jniandroid_service_SimpleObject_booleanMethod(
JNIEnv * env, jobject obj, jboolean val) {
return !val;
}</span>

2、基本数据类型的数组应用

      2.1 c处理Java的int[],并返回该数组元素的总和。
public native int intArrayMethod(int[] intArray);
/**
* 求数组的和,返回一个int类型
*/
JNIEXPORT jint JNICALL Java_com_example_jniandroid_service_SimpleObject_intArrayMethod(
JNIEnv * env, jobject obj, jintArray array) {
int i, sum = 0;
//获取数组的长度
jsize len = (*env)->GetArrayLength(env, array);
//取得数组首地址的指针
jint *body = (*env)->GetIntArrayElements(env, array, 0);
for (i = 0; i < len; i++) {
//获取数组中的元素
sum += body[i];
}
//释放资源
(*env)->ReleaseIntArrayElements(env, array, body, 0);
LOGD("数组总和 =%d", sum);
return sum;
}

2.2 native方法返回一个int[].

public native int[] receiverIntArray();

对应的c签名

/**
* 返回Java的int[]类型
*/
JNIEXPORT jintArray JNICALL Java_com_example_jniandroid_service_SimpleObject_receiverIntArray(
JNIEnv * env, jobject obj) {
int i = 1;
jintArray array; //定义数组对象
array = (*env)->NewIntArray(env, 10);
for (; i <= 10; i++) {
//void SetIntArrayRegion(jintArray array, jsize start, jsize len,const jint *buf)// len:为1
(*env)->SetIntArrayRegion(env, array, i - 1, 1, &i);
}
/* 获取数组对象的元素个数 */
int len = (*env)->GetArrayLength(env, array);
/* 获取数组中的所有元素 */
jint* elems = (*env)->GetIntArrayElements(env, array, 0); for (i = 0; i < len; i++) {
LOGD("ELEMENT %d IS %d\n", i, elems[i]);
} return array; }

3、JNI处理string类型和String数组

	public native String stringMethod(String text);

	public native String[] receiverStringArray(String val);

下面是jni的实现,在c文件的前面声明数组长度 #define ARRAY_LENGTH 5 。第一个方法是将一个字符串中的每个字符转换成大写,第二方法返回一个String类型的数组。这里用到了FindClass方法,它主要根据类的包名找到该类的class,在通过new方法创建对象。

JNIEXPORT jstring JNICALL Java_com_example_jniandroid_service_SimpleObject_stringMethod(
JNIEnv * env, jobject obj, jstring string) {
const char *str = (*env)->GetStringUTFChars(env, string, 0);
char cap[128];
//copy字符串
strcpy(cap, str);
(*env)->ReleaseStringUTFChars(env, string, str);
int i = 0;
for (i = 0; i < strlen(cap); i++) {
//转换成大写
*(cap + i) = (char) toupper(*(cap + i));
}
return (*env)->NewStringUTF(env, cap); } /**
* 返回Java字符串数组
*/
JNIEXPORT jobjectArray JNICALL Java_com_example_jniandroid_service_SimpleObject_receiverStringArray(
JNIEnv * env, jobject obj, jstring val) {
//FindClass找到Java中String这个类,返回jni的jclass对象
jclass objClass = (*env)->FindClass(env, "java/lang/String");
//NewObjectArray创建对象数组,第二个参数长度,第三个类型
jobjectArray texts = (*env)->NewObjectArray(env, (jsize) ARRAY_LENGTH,objClass, 0);
jstring jstr;
char* sa[] = { "Hello,", "world", "jni", "iii", "爱死你了" };
int i = 0;
for (; i < ARRAY_LENGTH; i++) {
//创建jstring并赋值,NewStringUTF()函数将C语言的字符串转换为jstring类型
jstr = (*env)->NewStringUTF(env, sa[i]);
//赋值
(*env)->SetObjectArrayElement(env, texts, i, jstr); //必须放入jstring
}
return texts; }

JNI由浅入深_5_基本类型应用的更多相关文章

  1. JNI中修改(基本类型)参数并返回到Java层使用

    最近在JNI相关项目中遇到一个问题:在Java层传入多个int类型的参数,在jni层修改参数值或地址之后重新返回到Java层.这应该算是基本知识了,尤其是基本类型的参数往往看似简单,所以在之前学习jn ...

  2. JNI由浅入深_10_JNI 综合开发

    1.使用ndk-build时如果找不到某个类,可以使用下面两种方法解决: 1.1 进入src目录 D:\project3\JNIAndroid\src>set classpath=D:\proj ...

  3. JNI由浅入深_9_JNI 异常处理

    1 .本地代码中如何缓存和抛出异常 下面的代码中演示了如何声明一个会抛出异常的本地方法.CatchThrow这个类声明了一个会抛出IllegalArgumentException异常的名叫doit的本 ...

  4. JNI由浅入深_7_c调用Java方法一

    1.在Java中声明方法 <span style="font-size:14px;">/** * javah -encoding utf-8 -jni com.exam ...

  5. JNI由浅入深_6_简单对象的应用

    1.声明native方法 public class ComplexObject { /** * 返回一个对象数组 * @param val * @return */ public native Per ...

  6. JNI由浅入深_4_JNI基础知识详解

    Java Native Interface (JNI)标准是java平台的一部分,它允许Java代码和其他语言写的代码进行交互.JNI 是本地编程接口,它使得在 Java 虚拟机 (VM) 内部运行的 ...

  7. JNI由浅入深_3_Hello World

    1.需要准备的工具,eclipse,cdt(c++)插件,cygwin(unix)和 android ndk. 在cygwin的etc目录下将ndk的路径引入到profile文件中,可以在cygwin ...

  8. JNI由浅入深_8_JNI缓存字段和方法ID

    获取字段ID和方法ID时,需要用字段.方法的名字和描述符进行一个检索.检索过程相对比较费时,因此本节讨论用缓存技术来减少这个过程带来的消耗.缓存字段ID和方法ID的方法主要有两种.两种区别主要在于缓存 ...

  9. JNI由浅入深_2_C语言基础

    *含义 1.乘法 3*5 2.定义指针变量 int * p://定义了一个名字叫p的变量,能够存放int数据类型的地址 3.指针运算符, //如果p是一个已经定义好的指针变量则*p表示以p的内容为地址 ...

随机推荐

  1. JDK的安装与卸载

      1.jdk 下载链接:http://www.oracle.com/technetwork/java/javase/downloads/jdk9-downloads-3848520.html 2.在 ...

  2. Centos的一个find命令配合rm删除某天前的文件

    语句写法:find 对应目录 -mtime +天数 -name "文件名" -exec rm -rf {} \; 例1: 将/usr/local/backups目录下所有10天前带 ...

  3. Web服务器学习总结(一):web服务器简介

    一.WEB服务器 1.1.WEB服务器简介 1.Web服务器是指驻留于因特网上某种类型计算机的程序,是可以向发出请求的浏览器提供文档的程序.当Web浏览器(客户端)连到服务器上并请求文件时,服务器将处 ...

  4. org.springframework.data.mongodb.core.MongoTemplate]: Constructor threw exception; nested exception is java.lang.NoSuchMethodError: org.springframework.core.convert.support.ConversionServiceFactory.cr

    spring-data-mongo 和spring core包冲突.解决办法: <dependency> <groupId>org.springframework.data&l ...

  5. maven(17)-自动发布到远程linux服务器

     发布方式 手工方式:需要做一系列的工作,包括打WAR包,上传到服务器,重启服务器,删除旧文件等 自动方式:一条命令完成以上所有过程 服务器环境 centos7.3和tomcat8,关于cento ...

  6. Docker Toolbox更换镜像源并下载centos7

  7. SQL Server ->> 高可用与灾难恢复(HADR)技术之 -- Transaction Replication(事务复制)

    复制类型: 1)事务型复制:通过复制事务日志到订阅点重做的方式,属于增量型复制: 2)合并型复制:通过触发器和元数据表追踪表数据改变,同样属于增量型复制: 3)快照型复制:通过创建数据库快照,并把快照 ...

  8. 如何提高Ajax性能

    1.适当使用缓存机制 2.使用CDN内容分发来访问Jquery脚本: (1)自己公司架设CDN服务器 (2)使用第三方公司的,比如微软,谷歌等公司的CDN,但有时候不太靠谱 3.JS/CSS文件的打包 ...

  9. redis-day1

    1 Redis 概述 REmote DIctionary Server(Redis)是一个基于key-value键值对的持久化数据库存储系统.redis和大名鼎鼎的Memcached缓存服务软件很像, ...

  10. 天池精准医疗大赛——人工智能辅助糖尿病遗传风险预测

    作为天池上的新手,第一次参加天池阿里云线上的比赛,糖尿病预测, 一般的数据挖掘比赛,流程:数据清洗,特征工程(找特征,特征组合),不断的尝试的不同算法,不断调参,也可以考虑将多个模型进行线性组合 大赛 ...