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;
}





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章