1. 程式人生 > >Android studio 中使用Jni

Android studio 中使用Jni


#include "test.h"
#include "com_suixi_ndkproject_JNI.h"
#include <stdio.h>
#include <stdlib.h>
#include <android/log.h>
#include <string.h>
#define LOG_TAG "linzhenxiang"//列印日誌的別名,可自己去
#define LOGI(...)  __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)
#define LOGE(...)  __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)
#define LOGI(...)  __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)

//jstring to char*  jString 轉換成 char*指標
char *jstringTochar(JNIEnv *env, jstring jstr) {
    char *rtn = NULL;
    jclass clsstring = (*env)->FindClass(env, "java/lang/String");
    jstring strencode = (*env)->NewStringUTF(env, "utf-8");
    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;
}

JNIEXPORT jstring JNICALL Java_com_suixi_ndkproject_JNI_sayHello
        (JNIEnv *env, jobject jobject1) {
    // jstring     (*NewStringUTF)(JNIEnv*, const char*);
    char *s = "I AM FROM C";
    return (*env)->NewStringUTF(env, s);

};

/**
 * 返回帶有引數的字串
 */
JNIEXPORT jstring JNICALL Java_com_suixi_ndkproject_JNI_sayAddHello
        (JNIEnv *env, jobject jobject1, jstring js) {

    char *from = jstringTochar(env, js);
    char *to = "I am from c";

    strcat(from, to);//字串拼接,會把拼接後的結果放在第一個引數裡

    return (*env)->NewStringUTF(env, from);


};

/**
 * 加法運算
 */

JNIEXPORT jint JNICALL Java_com_suixi_ndkproject_JNI_add
        (JNIEnv *env, jobject jobject1, jint x, jint y) {
    return x + y;
};

/**
 * 給陣列的每個元素新增10
 */
JNIEXPORT jintArray JNICALL Java_com_suixi_ndkproject_JNI_increaseArray
        (JNIEnv *env, jobject jobject1, jintArray array) {
    //jsize       (*GetArrayLength)(JNIEnv*, jarray);
    jsize size = (*env)->GetArrayLength(env,array);//獲取陣列的長度
    //    jint*       (*GetIntArrayElements)(JNIEnv*, jintArray, jboolean*);
    jint* jint1 =  (*env)->GetIntArrayElements(env,array,JNI_FALSE);//獲取陣列中的元素
    int i;
    for(i=0;i<size;i++){
        *(jint1+i)+=10;
    }

    return array;

};
/**
 * 檢查密碼是否正確
 */
JNIEXPORT jint JNICALL Java_com_suixi_ndkproject_JNI_checkPwd
        (JNIEnv * env, jobject jobject1, jstring js){

    char * from = jstringTochar(env,js);
    char * origin = "123456";
    //extern int    strcmp(const char *, const char *) __purefunc;
    int code = strcmp(from,origin);//strcmp函式用於比較兩個字串是否相等

    LOGE("code = %d",code);
    if(code==0){
        return 400;
    }else{
        return 200;
    }

};