Android studio NDK成长记录(三)Java调用C的各种情况解析

来源:互联网 发布:win pe 知乎 编辑:程序博客网 时间:2024/05/16 01:01
  1. 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