Android studio 中使用Jni
阿新 • • 發佈:2019-01-30
#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; } };