Android的JNI【实战教程】3⃣️--Java调用C代码
来源:互联网 发布:win10设置元素数据出错 编辑:程序博客网 时间:2024/06/11 20:03
看了上一篇:
http://blog.csdn.net/github_33304260/article/details/62891083
我们应该已经可以构建NDK工程了 ,
接下来让我们看看Java调用C代码:
Java调用C代码执行加法操作
java代码:
/** * 通过JNI简单进行整形加法操作 * @param a * @param b * @return */ public static native int addInt(int a, int b);
.h代码:
/* * Class: com_libin_factory_ndk_NDK * Method: addInt * Signature: (II)I */JNIEXPORT jint JNICALL Java_com_libin_factory_ndk_NDK_addInt (JNIEnv *, jclass, jint, jint);
c++代码:
JNIEXPORT jint JNICALL Java_com_libin_factory_ndk_NDK_addInt (JNIEnv *env, jclass type, jint a, jint b) { return a + b;}
调用:
Toast.makeText(JNIActivity.this, "相加结果:" + NDK.addInt(10, 2), Toast.LENGTH_SHORT).show();
展示:
说明:
Java_全类名_方法名
Java_com_libin_factory_ndk_NDK_addInt
Java调用C代码执行字符串拼接操作
java代码:
/** * 通过JNI简单进行字符串拼接操作 * @param s * @return */ public static native String addString(String s);
.h代码:
/* * Class: com_libin_factory_ndk_NDK * Method: addString * Signature: (Ljava/lang/String;)Ljava/lang/String; */JNIEXPORT jstring JNICALL Java_com_libin_factory_ndk_NDK_addString (JNIEnv *, jclass, jstring);
c++代码:
/** * 通过JNI简单进行字符串拼接操作 * @param s * @return */JNIEXPORT jstring JNICALL Java_com_libin_factory_ndk_NDK_addString (JNIEnv *env, jclass type, jstring s_) { char *text = jstringToChar(env, s_); char temp[20] = " / I am from c"; strcat(text, temp); return charToString(env, text);}
下面两个是工具类
/** * String转换为Char * @param env * @param jstr * @return */char* jstringToChar(JNIEnv* env, jstring jstr) { char* rtn = NULL; jclass clsstring = env->FindClass("java/lang/String"); jstring strencode = env->NewStringUTF("utf-8"); jmethodID mid = env->GetMethodID(clsstring, "getBytes", "(Ljava/lang/String;)[B"); jbyteArray barr= (jbyteArray)env->CallObjectMethod(jstr, mid, strencode); jsize alen = env->GetArrayLength(barr); jbyte* ba = env->GetByteArrayElements(barr, JNI_FALSE); if (alen > 0) { rtn = (char*)malloc(alen + 1); memcpy(rtn, ba, alen); rtn[alen] = 0; } env->ReleaseByteArrayElements(barr, ba, 0); return rtn;}/** * Char转换成String * @param env * @param chr * @return */jstring charToString(JNIEnv *env, const char *chr){ //LOGI("charToString: %s\n", chr); jclass strClass = env->FindClass("java/lang/String"); jmethodID strConstruct = env->GetMethodID(strClass, "<init>", "([BLjava/lang/String;)V"); jbyteArray bytes = env->NewByteArray(strlen(chr)); env->SetByteArrayRegion(bytes, 0, strlen(chr), (jbyte*)chr); jstring encoding = env->NewStringUTF("utf-8"); return (jstring)env->NewObject(strClass, strConstruct, bytes, encoding);}
调用:
Toast.makeText(JNIActivity.this, "JNI结果 :" + NDK.addString("I am From Java"), Toast.LENGTH_SHORT).show();
展示:
Java调用C代码执行每个元素加上10
java代码:
/** * 让C代码给你每个元素加上10 * @param intArray * @return */ public static native int[] increaseArrayEles(int[] intArray);
.h代码:
/* * Class: com_libin_factory_ndk_NDK * Method: increaseArrayEles * Signature: ([I)[I */JNIEXPORT jintArray JNICALL Java_com_libin_factory_ndk_NDK_increaseArrayEles (JNIEnv *, jclass, jintArray);
c++代码:
/*** 让C代码给你每个元素加上10* @param intArray* @return*/JNIEXPORT jintArray JNICALLJava_com_libin_factory_ndk_NDK_increaseArrayEles(JNIEnv *env, jclass type, jintArray intArray_) { //得到数组的长度 jsize size = env->GetArrayLength(intArray_); //得到数组元素 jint *array = env->GetIntArrayElements(intArray_, JNI_FALSE); //JNI_FALSE同一份 不开辟新空间 //遍历数组给每个元素加上10 for (int i = 0; i < size; i++) { *(array + i) += 10; LOGE("array %d = %d", i, *(array + i)); } env->ReleaseIntArrayElements(intArray_, array, 0); //返回结果 return intArray_;}
调用:
int a[] = {1,2,3,4,5,6,7};int[] ints = NDK.increaseArrayEles(a);for (int i = 0 ; i< ints.length;i++){ Logger.e(a[i]+"");}
展示:
Java调用C代码执行检测密码是否正确
java代码:
/** * 应用:检测密码是否正确,正确返回200,错误返回400 * @param pwd * @return */ public static native int checkPwd(String pwd);
.h代码:
/* * Class: com_libin_factory_ndk_NDK * Method: checkPwd * Signature: (Ljava/lang/String;)I */JNIEXPORT jint JNICALL Java_com_libin_factory_ndk_NDK_checkPwd (JNIEnv *, jclass, jstring);
c++代码:
/*** 应用:检测密码是否正确,正确返回200,错误返回400* @param pwd* @return*/JNIEXPORT jint JNICALLJava_com_libin_factory_ndk_NDK_checkPwd(JNIEnv *env, jclass type, jstring pwd_) { //假设服务器密码123456 char *otigin = "123456"; char *fromUser = jstringToChar(env, pwd_); //函数比较字符串是否相同 int code = strcmp(otigin, fromUser); if (code == 0) { return 200; } else { return 400; }}
调用:
Toast.makeText(JNIActivity.this,"密码校验"+ NDK.checkPwd("123456"), Toast.LENGTH_SHORT).show();
展示:
下面我们可以在看看 C调用java:
http://blog.csdn.net/github_33304260/article/details/71213921
8 0
- Android的JNI【实战教程】3⃣️--Java调用C代码
- Android的JNI【实战教程】4⃣️--C调用Java代码
- Android的JNI【实战教程】1⃣️--java和c/c++的那些事
- Android 基于NDK的JNI开发 C调用java和java调用C的进阶教程
- Android 基于NDK的JNI开发 C调用java和java调用C的进阶教程
- Android的JNI【实战教程】6⃣️--温控计
- [原创]Android 基于NDK的JNI开发 C调用java和java调用C的进阶教程
- [原创]Android 基于NDK的JNI开发 C调用java和java调用C的进阶教程
- 用Android Studio通过Java代码调用C代码的JNI流程
- Android JNI C调用Java
- Android JNI中C和JAVA代码之间的互相调用
- android调用本地C/C++代码,jni的实现
- Java JNI调用dll中的C代码的流程
- Android的JNI【实战教程】5⃣️---Android Studio 2.2 以上 NDK开发
- 使用JNI,让java调用c代码
- jni 使用java 调用C代码
- jni-使用c代码调用java文件
- Android的JNI【实战教程】2⃣️--AS下NDK环境配置及第一个工程
- Spring MVC程序中得到静态资源文件css,js,图片
- IIS的安装及配置
- Spring学习随笔记
- linux版推箱子(带地图编辑器)
- POJ 1654 Area 几何(叉积求多边形面积)
- Android的JNI【实战教程】3⃣️--Java调用C代码
- 游戏打击感
- Oracle创建用户、授权、导入导出数据库
- 解决MySQL中乱码问题
- 运行Chrome中的app
- 【面试】JSP中动态INCLUDE与静态INCLUDE的区别
- MyBatis运行时报:Parameter Maps collection dose not contain value for java.util.Map
- React Native学习ListView(三):吸顶效果
- Github使用指南