Android studio NDK成长记录(三)Java调用C的各种情况解析
来源:互联网 发布:win pe 知乎 编辑:程序博客网 时间:2024/05/16 01:01
- Java调用C代码的各种情况
下面NativeMethord类中的方法跟C代码里面的方法相对应。
Java代码:public class NativeMethord { static { System.loadLibrary("native_jni"); } public static native int add(int x, int y); public static native String getString(String string); public static native int[] increaseArrayEles(int[] intArray); public static native int checkPssword(String password);}
C代码:
C代码中的方法中(JNIEnv *env, jobject jobject1)这两个参数必不可少,java传过来的参数,按顺序接在后面
//将java中的String类型转换为C语言中的jstringchar *_JString2CStr(JNIEnv *env, jstring jstr) { char *rtn = NULL; jclass clsstring = (*env)->FindClass(env, "java/lang/String"); jstring strencode = (*env)->NewStringUTF(env, "GB2312"); jmethodID mid = (*env)->GetMethodID(env, clsstring, "getBytes", "(Ljava/lang/String;)[B"); jbyteArray barr = (jbyteArray) (*env)->CallObjectMethod(env, jstr, mid, strencode); jsize alen = (*env)->GetArrayLength(env, barr); jbyte *ba = (*env)->GetByteArrayElements(env, barr, JNI_FALSE); if (alen > 0) { rtn = (char *) malloc(alen + 1); memcpy(rtn, ba, alen); rtn[alen] = 0; } (*env)->ReleaseByteArrayElements(env, barr, ba, 0); return rtn;}
/* *对应getString方法,接收Java中传过来的字符串,然后跟C代码里面的字符串进行拼接之后返回给Java * * Class: com_picovr_javacall_NativeMethord * Method: getString * Signature: (Ljava/lang/String;)Ljava/lang/String; */JNIEXPORT jstring JNICALL Java_com_picovr_javacall_NativeMethord_getString (JNIEnv *env, jobject jobject1, jstring jstring1) { //将Java中的String类型转换成jstring类型 char *from_java = _JString2CStr(env, jstring1); //声明一个C代码种生成的字符串用于跟Java中的字符串拼接 char *from_c = "add I am from C !"; //把两个字符串拼接,并赋值给第一个变量 strcat(from_java, from_c); //返回拼接之后的字符串 return (*env)->NewStringUTF(env, from_java);}/* *接收Java传过来的一个数组,将数组中的每一个数都加10,并将这个数组返回 * * Class: com_picovr_javacall_NativeMethord * Method: increaseArrayEles * Signature: ([I)[I */JNIEXPORT jintArray JNICALL Java_com_picovr_javacall_NativeMethord_increaseArrayEles (JNIEnv *env, jobject jobject1, jintArray jArr) { //获得Java中传过来的数组的长度 jsize length = (*env)->GetArrayLength(env, jArr); //将Java中的数组赋值给一个指针 jint *intArray = (*env)->GetIntArrayElements(env, jArr, JNI_FALSE); //将数组中的每个元素+10 for (int i = 0; i < length; ++i) { *(intArray + i) += 10; } return jArr;}/* *接收Java中传过来的字符串密码,用C校验这个密码 * * Class: com_picovr_javacall_NativeMethord * Method: checkPssword * Signature: (Ljava/lang/String;)I */JNIEXPORT jint JNICALL Java_com_picovr_javacall_NativeMethord_checkPssword (JNIEnv *env, jobject jobject1, jstring jstring1) { //C中写死的密码 char *origin = "123456"; //将Java中传过来的字符串转为C中的char指针 char *fromUser = _JString2CStr(env, jstring1); //比较两个字符串是否相同 int result = strcmp(origin, fromUser); return result;}
0 0
- Android studio NDK成长记录(三)Java调用C的各种情况解析
- Android studio NDK成长记录(四)C调Java的各种情况解析
- Android studio NDK成长记录(二)ndk-build
- Android studio NDK成长记录(五)将C中的Log打到Logcat
- Android studio NDK成长记录(一)CMake
- Android Studio NDK开发之一(Java调用C的方法)
- Android Studio下的NDK开发(三):C中通过JNIEnv访问Java中的内容
- NDK开发java调用c(三)
- Android NDK学习记录(二):C/C++调用Java代码
- android NDK--C 调用java
- NDK C/C++ 调用 Java (三)
- 转战Android之NDK(jni, java调用c/c++)
- Android之NDK(jni, java调用c/c++)
- 基于 Android NDK 的学习之旅-----Java 调用C
- 基于 Android NDK 的学习之旅----- C调用Java
- 基于 Android NDK 的学习之旅-----Java 调用C
- 基于 Android NDK 的学习之旅----- C调用Java
- 基于 Android NDK 的学习之旅-----Java 调用C
- [生存志] 第131节 纷纷汉家天子事
- React Native 中 component 生命周期
- 文本处理工具
- s:select属性说明和用法介绍
- Android IOS WebRTC 音视频开发总结(五五)-- 音视频通讯中的抗丢包与带宽自适应原理
- Android studio NDK成长记录(三)Java调用C的各种情况解析
- 基数排序
- 话说GET与POST那点恩怨
- 深入学习JavaScript: apply 方法 详解(转)——非常好
- LeetCode
- 黎活明给程序员的忠告 收藏
- 贝叶斯网络框架
- shell常用操作命令系列:服务操作
- Ubuntu下mingw32装不上的问题