android jni

//
// Created by Donggui on 2018/6/7.
//
#include <jni.h>

#ifndef NETCACRYPTOANDROID_ANDROID_UTIL_H
#define NETCACRYPTOANDROID_ANDROID_UTIL_H
#ifdef __cplusplus
extern "C" {
#endif

#define NETCA_EXCEPTION "net/netca/pki/PkiException"
#define LOG_TAG "NETCAJNI"
#ifdef ANDROID
    #include <android/log.h>
    #define LOGD(...) ((void)__android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__))
    #define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__))
    #define LOGW(...) ((void)__android_log_print(ANDROID_LOG_WARN, LOG_TAG, __VA_ARGS__))
    #define LOGE(...) ((void)__android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__))
#else
    #define LOGD(fmt, ...) printf(fmt"\n", ##__VA_ARGS__)
    #define LOGI(fmt, ...) printf(fmt"\n", ##__VA_ARGS__)
    #define LOGW(fmt, ...) printf(fmt"\n", ##__VA_ARGS__)
    #define LOGE(fmt, ...) printf(fmt"\n", ##__VA_ARGS__)
#endif

char * get_jstring_chars(JNIEnv *env, jstring str);
void release_jstring_chars(JNIEnv *env, jstring str, char *data);

int get_jstring_len(JNIEnv *env, jstring str);

jstring chars_to_jstring(JNIEnv *env, const char *data);

void throw_netca_exception(JNIEnv *env, char *data, int code);

jbyteArray chars_to_jbytearray(JNIEnv *env, const char *data, int len);

jlongArray longs_to_jlongArray(JNIEnv *env, const jlong *data, int len);

void write_to_jbytearray(JNIEnv *env, jbyteArray jArr, const char *data, int len);

char * get_jbytearray_chars(JNIEnv *env,jbyteArray j_data, int *len);

void release_jbytearray_chars(JNIEnv *env,jbyteArray j_data,char *data);

jlong * get_jlongarray_jlongs(JNIEnv *env,jlongArray j_data, int *len);

int get_jbytearray_len(JNIEnv *env,jbyteArray j_data);

void release_jlongarray_jlongs(JNIEnv *env,jlongArray j_data,jlong *data);

#ifdef __cplusplus
}
#endif

#endif //NETCACRYPTOANDROID_ANDROID_UTIL_H

//
// Created by Donggui on 2018/6/7.
//
#include <stdint.h>
#include "jni_util.h"
#include <stdlib.h>
#include <string.h>


char * get_jstring_chars(JNIEnv *env, jstring str){
    char *data = NULL;
    const char *j_data;

    j_data = (*env)->GetStringUTFChars(env, str, 0);
    if(j_data!=NULL){
        data = (char *)malloc(sizeof(char)*(strlen(j_data)+1));
        memcpy(data, j_data, (strlen(j_data)+1));
    }
    (*env)->ReleaseStringUTFChars(env, str, j_data);
    return data;
}

void release_jstring_chars(JNIEnv *env, jstring str, char *data){
   free(data);
}

int get_jstring_len(JNIEnv *env, jstring str){
  int len = 0;
  if(str!=NULL){
    len = (*env)->GetStringUTFLength(env, str);
  }
  return len;
}

jstring chars_to_jstring(JNIEnv *env, const char *data){
    if(data!=NULL){
       return (*env)->NewStringUTF(env, data);
    }else{
       return NULL;
    }
}

jbyteArray chars_to_jbytearray(JNIEnv *env, const char *data, int len){
  if(data!=NULL){
    jbyteArray j_data= (*env)->NewByteArray(env, len);
    (*env)->SetByteArrayRegion(env, j_data, 0, len, data);
    return j_data;
  }else{
    return NULL;
  }
}

jlongArray longs_to_jlongArray(JNIEnv *env, const jlong *data, int len){
  if(data!=NULL){
    jlongArray j_data= (*env)->NewLongArray(env, len);
    (*env)->SetLongArrayRegion(env, j_data, 0, len, data);
    return j_data;
  }else{
    return NULL;
  }
}

void write_to_jbytearray(JNIEnv *env, jbyteArray jArr, const char *data, int len){
  if(data!=NULL&&jArr!=NULL){
    (*env)->SetByteArrayRegion(env, jArr, 0, len, data);
  }
}

int get_jbytearray_len(JNIEnv *env,jbyteArray j_data){
  int len = 0;
  if(j_data!=NULL){
    len = (*env)->GetArrayLength(env, j_data);
  }
  return len;
}

char * get_jbytearray_chars(JNIEnv *env,jbyteArray j_data, int *len){
  char *data = NULL;
  char *j_bytes;
  int j_byte_len = 0;
  if(j_data!=NULL){
    j_bytes = (*env)->GetByteArrayElements(env, j_data, 0);
    j_byte_len = (*env)->GetArrayLength(env, j_data);
    data = (char *)malloc(sizeof(char)*j_byte_len);
    memcpy(data, j_bytes, j_byte_len);
    (*env)->ReleaseByteArrayElements(env, j_data, j_bytes, 0);
  }

  (*len) = j_byte_len;
  return data;
}

void release_jbytearray_chars(JNIEnv *env,jbyteArray j_data,char *data){
    free(data);
}

jlong * get_jlongarray_jlongs(JNIEnv *env,jlongArray j_data, int *len){
  jlong * data;
  int data_len = 0;
  jlong * j_long_data;

  if(j_data!=NULL){
    j_long_data = (*env)->GetLongArrayElements(env, j_data, 0);
    data_len = (*env)->GetArrayLength(env, j_data);
    data = (jlong *)malloc(sizeof(jlong)*data_len);
    memcpy(data, j_long_data, data_len);
    (*env)->ReleaseLongArrayElements(env, j_data, j_long_data, 0);
  }
  (*len) = data_len;
  return data;
}

void release_jlongarray_jlongs(JNIEnv *env,jlongArray j_data,jlong *data){
    free(data);
}

void throw_netca_exception(JNIEnv *env, char *data, int code){

    jclass  netca_exception_clz = NULL;
    jmethodID netca_exception_constructor = NULL;
    char errorMsg[50];
    char *errorData = NULL;

    errorData = data;
    netca_exception_clz = (*env)->FindClass(env, NETCA_EXCEPTION);
    if(data==NULL||strlen(data) == 0){
      sprintf(errorMsg, "errorCode=%d", code);
      errorData = errorMsg;
    }
    if(errorData==NULL){
      errorData = "";
    }

    if(netca_exception_clz==NULL){
      return;
    }
    netca_exception_constructor = (*env)->GetMethodID(env, netca_exception_clz,"<init>","(Ljava/lang/String;)V");
    if(netca_exception_constructor==NULL){
      return;
    }
    jobject netca_exception_obj = (*env)->NewObject(env, netca_exception_clz, netca_exception_constructor, chars_to_jstring(env, errorData));
    if(netca_exception_obj==NULL){
      return;
    }
    (*env)->Throw(env, netca_exception_obj);
    (*env)->DeleteLocalRef(env, netca_exception_clz);

}

转载于:https://my.oschina.net/zdglf/blog/1829646

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值