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. Java Future源码分析

    JDK future框架,提供了一种异步编程模式,基于线程池的.将任务runnable/callable提交到线程池executor,返回一个Future对象.通过future.get()获取执行结果 ...

  2. csharp: Microsoft SqlHelper

    from: Microsoft Data Access Application Block for .NET  https://www.microsoft.com/en-us/download/con ...

  3. cf1060E. Sergey and Subway(树形dp)

    题意 题目链接 Sol 很套路的题 直接考虑每个边的贡献,最后再把奇数点的贡献算上 #include<bits/stdc++.h> #define Pair pair<int, in ...

  4. 【MySQL数据库】一些bug的解决

    往往碰到mysql配置好后,第二天就登不上,也运行不了服务. 在cmd中输入 net start mysql  报mysql无法启动系统错误1067等 解决方案: 以前搞到最后没办法,重装了,后来找到 ...

  5. Vue.js小案例(2)

    即时搜索 这个例子主要应用了vue.js的自定义过滤器,可以通过Vue.filter()注册一个全局过滤器,具体用法可以参考这里,vue.js也提供了一些内置过滤器. CSS代码: [v-cloak] ...

  6. LintCode2016年8月8日算法比赛----子树

    子树 题目描述 有两个不同大小的二叉树:T1有上百万的节点:T2有好几百的节点.请设计一种算法,判定T2是否为T1的子树. 注意事项 若 T1 中存在从节点 n 开始的子树与 T2 相同,我们称 T2 ...

  7. MVC框架以及实例

    MVC框架 MVC(model,view,controller),一种将业务逻辑.数据.界面分离的方法组织代码的框架.在改进界面及用户交互的同时,不需要重写业务逻辑.MVC将传统的输入.处理和输出分离 ...

  8. Python logger模块

    1 logging模块简介 logging模块是Python内置的标准模块,主要用于输出运行日志,可以设置输出日志的等级.日志保存路径.日志文件回滚等:相比print,具备如下优点: 可以通过设置不同 ...

  9. delete in javascript

    Key word delete. 1. Delete global object. x = 42; // creates the property x on the global object var ...

  10. Java学习---Map的学习

    1. Map 1.1. map中的方法 1.2. Map.Entry 对于集合来讲,就是把kye-value的数据保存在了Map.Entry的实例之后,再在Map集合中插入了一个Map.Entry的实 ...