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的内容为地址 ...
随机推荐
- 解决:IDEA 中 new Java Class 怎么没了?
前言:写代码时遇到的问题,所以记录下来.我的包名为“interface”,只有这个包及包下的文件不能建java文件. 问题 解决方式(对于普通包名) 点击应用,ok就可以了. 解决方式(对于包名为“i ...
- C# 进程通信-命名管道
之前看wcf服务的时候看到wcf有支持管道通信协议,之前不知道,最近刚好有用到这个,这里写个简单实例 .net有已经封装好的pip通信的对象NamedPipeServerStream 和NamedPi ...
- mysql备份整个数据库的表结构和数据
- jquery实现除指定区域外点击任何地方隐藏DIV
<!--弹出的表情选择框--> <div class="layui-input-block expression-box"> </div> &l ...
- SVN - Checksum mismatch while updating
Go to the folder with the file causing problems Execute command svn update --set-depth empty (note: ...
- [iOS] UIFont 设置字体
label.font = [UIFont fontWithName:@"Arial-BoldItalicMT" size:24]; 字体名如下: Font Family: Amer ...
- C/C++内存管理详解 ZZ
内存管理是C++最令人切齿痛恨的问题,也是C++最有争议的问题,C++高手从中获得了更好的性能,更大的自由,C++菜鸟的收获则是一遍一遍的 检查代码和对C++的痛恨,但内存管理在C++中无处不在,内存 ...
- c#多线程调用有参数的方法
Thread (ParameterizedThreadStart) 初始化 Thread 类的新实例,指定允许对象在线程启动时传递给线程的委托. Thread (ThreadStart) 初始 ...
- 用FileZilla Server开FTP
FileZilla(教程)是经典的开源FTP解决方案,包括FileZilla客户端和FileZilla Server.其中,FileZilla Server的功能比起商业软件FTP Serv-U毫不逊 ...
- Linux操作NFS挂载、卸载等操作
一.NFS服务器的设置 NFS服务器的设定可以通过/etc/exports这个文件进行,设定格式如下 分享目录 主机名或IP(参数1,参数2) /binbin 172.17.1.*(rw,sync,n ...