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

  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语言中的jstring
char *_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;
}

 

 

 

 

转载于:https://my.oschina.net/u/2337595/blog/832428

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值