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