JNI由浅入深_5_基本类型应用
1、基本类型应用
<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、基本数据类型的数组应用
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_基本类型应用的更多相关文章
- JNI中修改(基本类型)参数并返回到Java层使用
最近在JNI相关项目中遇到一个问题:在Java层传入多个int类型的参数,在jni层修改参数值或地址之后重新返回到Java层.这应该算是基本知识了,尤其是基本类型的参数往往看似简单,所以在之前学习jn ...
- JNI由浅入深_10_JNI 综合开发
1.使用ndk-build时如果找不到某个类,可以使用下面两种方法解决: 1.1 进入src目录 D:\project3\JNIAndroid\src>set classpath=D:\proj ...
- JNI由浅入深_9_JNI 异常处理
1 .本地代码中如何缓存和抛出异常 下面的代码中演示了如何声明一个会抛出异常的本地方法.CatchThrow这个类声明了一个会抛出IllegalArgumentException异常的名叫doit的本 ...
- JNI由浅入深_7_c调用Java方法一
1.在Java中声明方法 <span style="font-size:14px;">/** * javah -encoding utf-8 -jni com.exam ...
- JNI由浅入深_6_简单对象的应用
1.声明native方法 public class ComplexObject { /** * 返回一个对象数组 * @param val * @return */ public native Per ...
- JNI由浅入深_4_JNI基础知识详解
Java Native Interface (JNI)标准是java平台的一部分,它允许Java代码和其他语言写的代码进行交互.JNI 是本地编程接口,它使得在 Java 虚拟机 (VM) 内部运行的 ...
- JNI由浅入深_3_Hello World
1.需要准备的工具,eclipse,cdt(c++)插件,cygwin(unix)和 android ndk. 在cygwin的etc目录下将ndk的路径引入到profile文件中,可以在cygwin ...
- JNI由浅入深_8_JNI缓存字段和方法ID
获取字段ID和方法ID时,需要用字段.方法的名字和描述符进行一个检索.检索过程相对比较费时,因此本节讨论用缓存技术来减少这个过程带来的消耗.缓存字段ID和方法ID的方法主要有两种.两种区别主要在于缓存 ...
- JNI由浅入深_2_C语言基础
*含义 1.乘法 3*5 2.定义指针变量 int * p://定义了一个名字叫p的变量,能够存放int数据类型的地址 3.指针运算符, //如果p是一个已经定义好的指针变量则*p表示以p的内容为地址 ...
随机推荐
- 图解 CMS 垃圾回收机制,你值得拥有(转 强烈推荐)
首页 所有文章 资讯 Web 架构 基础技术 书籍 教程 Java小组 工具资源 - 导航条 - 首页 所有文章 资讯 Web 架构 基础技术 书籍 教程 Java小组 工具资源 ...
- BZOJ4011: [HNOI2015]落忆枫音(dp 乘法原理)
题意 题目链接 Sol 非常妙的一道题 设\(inder[i]\)表示\(i\)号节点的度数 首先如果是个DAG的话,可以考虑在每个点的入边中选一条边作为树形图上的边,这样\(ans = \prod_ ...
- vue项目性能优化(路由懒加载、gzip加速、cdn加速)
前端工程性能优化一说意义深远悠长,本章主要介绍除了一些基础优化外如何实行路由懒加载.Gzip加速.CDN加速,让网页飞的快一些. 基础优化 老生常谈的一些: 不要在模板中写复杂的表达式 慎用watch ...
- Android之NDK环境配置+JNI开发+so文件编译
前言 这边Android作为日常记录,虽然破坏了文章队形~ 最近人工智能挺火的,也稍微了解了一些库,比如关于视觉库openCV.要在安卓下调用这些C/C++库,需要用到JNI开发,在此把过程分享一 ...
- Postman-Tests模块测试方法记录
用Postman的时候大多数测试结果是可以用Tests模块的测试方法来代替人工检查的,测试方法本质上是JavaScript代码,我们可以通过运行测试用例(测试脚本是在发送请求之后并且从服务器接收到响应 ...
- Breakpoint debugging
断点调试的作用: A:查看程序的执行流程. B:调试程序. package basic.java; public class DebugTest { public static void main(S ...
- jquery尺寸和jQuery设置和获取内容方法
一.jquery尺寸 jQuery 提供多个处理尺寸的重要方法: width() 设置或返回元素的宽度(不包括内边距.边框或外边距),括号中可填数值宽度参数,无单位 height() 设置或 ...
- Android获取蓝牙地址
最近做一个项目,发现Android6.0以上的版本获取的蓝牙地址始终为02:00:00:00, Google一下发现Android早就封掉了相关接口,于是想到反射的方式去获取Mac地址,在此记录一下 ...
- RAP, 高效前后端联调框架,接口文档管理工具
RAP通过GUI工具帮助WEB工程师更高效的管理接口文档,同时通过分析接口结构自动生成Mock数据.校验真实接口的正确性,使接口文档成为开发流程中的强依赖.有了结构化的API数据,RAP可以做的更多, ...
- Spring Cloud中,Eureka常见问题总结
Spring Cloud中,Eureka常见问题总结. 1 eureka.environment: 指定环境 参考文档: 1 eureka.datacenter: 指定数据中心 参考文档: 使用配置项 ...