目前应用Android Studio 可以很方便的构建完成通过JNI调用c++/c 的基本架构(CMakeLists,
JNI调用C部分,java连接JNI 部分)。希望通过APP开发中应用实例的简要介绍,为使用JNI调用c++/c提供有益的参考借鉴。
一,java连接JNI 部分
由于APP开发中,涉及到了多个C++ Library,为了便于管理特别设置了一个独立的包名(JavaLoadCppLib),将有关库的Java类放到一个包名下。
本篇以“ActEventDataClass”为例来进行说明。"ActEventDataClass" Java类,对应的是“ActEventData-lib” C++/C库。
package com.bi3eview.newstart60.local.JavaLoadCppLib;
import android.content.Context;
import android.content.res.AssetManager;
import com.bi3eview.newstart60.local.NetServer.NETCOMSTATIC;
import com.bi3eview.newstart60.local.Person.PersonData;
import com.bi3eview.newstart60.local.bs60Application;
import com.bi3eview.newstart60.local.R;
public class ActEventDataClass {
static boolean sysloadbv = false;
static {
try {
System.loadLibrary("ActEventData-lib");
sysloadbv = true;
}catch (Throwable e) {
sysloadbv = false;
// Log.d("zzzzz","加载xx库异常 :"+e.toString());
}
}
/**
* Java call JNI interface
*/
public static void Startgo(){
Start();
}
public static int JavaJNIsaveSsysData(){
//
int iretv = JNIsaveSsysData();
return iretv;
}
public static int JavaJNIgetSetNoteBookItem(int iobjctrl,int[] daparv,int idajno,byte[] RbyteArr,int jmaxByten) {
int iretv = JNIgetSetNoteBookItem(iobjctrl,daparv,idajno,RbyteArr,jmaxByten);
return iretv;
}
public static int JavaJNIgetRecordEventViewDataLst(int iobjctrl,int[] daparv,int idajno,byte[] RbyteArr,int jmaxByten) {
int iretv = JNIgetRecordEventViewDataLst(iobjctrl,daparv,idajno,RbyteArr,jmaxByten);
return iretv;
}
public static int JavaJNIgetSetDataParaModelInfo(int iobjctrl,int[] daparv,int idajno,byte[] RbyteArr,int jmaxByten) {
int iretv = JNIgetSetDataParaModelInfo(iobjctrl,daparv,idajno,RbyteArr,jmaxByten);
return iretv;
}
public static int JavaJNIgetSetPersonDataItem(int iobjctrl,int[] daparv,int idajno,byte[] RbyteArr,int jmaxByten) {
int iretv = JNIgetSetPersonDataItem(iobjctrl,daparv,idajno,RbyteArr,jmaxByten);
return iretv;
}
public static int JavaJNIgetSetDoubleValueDaItem(int iobjctrl,double[] daparv,int idajno,byte[] RbyteArr,int jmaxByten) {
int iretv = JNIgetSetDoubleValueDaItem(iobjctrl,daparv,idajno,RbyteArr,jmaxByten);
return iretv;
}
public static int JavaJNIgetSetDbaseUnitItem(int iobjctrl,int[] daparv,int idajno,byte[] RbyteArr,int jmaxByten) {
int iretv = JNIgetSetDbaseUnitItem(iobjctrl,daparv,idajno,RbyteArr,jmaxByten);
return iretv;
}
public static int JavaJNIcheckAssetFileIfExist(AssetManager assetManager,String strAssetFile)
{
int iretv = JNIcheckAssetFileIfExist(assetManager,strAssetFile);
return iretv;
}
public static int JavaJNIgetSetDbaseTextItem(int iobjctrl,int[] daparv,int idajno,byte[] RbyteArr,int jmaxByten) {
int iretv = JNIgetSetDbaseTextItem(iobjctrl,daparv,idajno,RbyteArr,jmaxByten);
return iretv;
}
public static int JavaJNIbuildEventModel(int iobjctrl,byte[] RbyteArr,int nameByten) {
int iretv = JNIbuildEventModel(iobjctrl,RbyteArr,nameByten);
return iretv;
}
// 。。。。。。。。。。。。。。。。
/**
* JNI fuction
*/
private native static int Start(byte[] byteArrda,int[] charItemjn);
private native static int JNIsaveSsysData();
private native static int JNIgetSetNoteBookItem(int iobjctrl,int[] iparv,int idajno,byte[] byteArrda,int maxByten);
private native static int JNIgetRecordEventViewDataLst(int iobjctrl,int[] chkparv,int idajno,byte[] byteArrda,int maxByten);
private native static int JNIgetSetDataParaModelInfo(int iobjctrl,int[] chkparv,int idajno,byte[] byteArrda,int maxByten);
private native static int JNIgetSetPersonDataItem(int iobjctrl,int[] chkparv,int idajno,byte[] byteArrda,int maxByten);
private native static int JNIgetSetDoubleValueDaItem(int iobjctrl,double[] chkparv,int idajno,byte[] byteArrda,int maxByten);
private native static int JNIgetSetDbaseUnitItem(int iobjctrl,int[] chkparv,int idajno,byte[] byteArrda,int maxByten);
private native static int JNIgetSetDbaseTextItem(int iobjctrl,int[] chkparv,int idajno,byte[] byteArrda,int maxByten);
private native static int JNIcheckAssetFileIfExist(AssetManager assetManager,String strAssetFile);
// 。。。。。。。
/** system exsample */
public native String stringFromJNI();
}
为了能在不同的Fragment中,简便的调用JNI函数,Java 调用JNI接口类中使用了static类型。 在Java中通过JNI应用C++/c 设置(或提取)数据,用的主要是String和byte数据类型,经常要使用 byte 转String 及String 转byte 的函数,这里也顺便提供部分代码供参考。
---- byte 转 String
byte[] tmpRbyteArr = new byte[388];
int[] daparv = new int[18];
daparv[0] = 0;
daparv[1] = 0;
daparv[2] = 0;
daparv[3] = 0;
daparv[4] = 0;
daparv[5] = 0;
daparv[6] = 0;
int iretItemNum = ActEventDataClass.JavaJNIgetSetNoteBookItem(NOTEBOOK_GETLSTNUM,daparv,-1,tmpRbyteArr,380);
if(iretItemNum >= 0) {
NoteBookData.mcurItemMode = tmpRbyteArr[0];
int icol1Namecn = daparv[1];
int iboffv = 1;
if (icol1Namecn > 0) {
String Col1Name = new String(tmpRbyteArr, iboffv, icol1Namecn);
iboffv = iboffv + icol1Namecn;
//.... mcol1_nameTitle.setText(Col1Name);
}
int icol2Notecn = daparv[2];
if (icol2Notecn > 0) {
String Col2Note = new String(tmpRbyteArr, iboffv, icol2Notecn);
iboffv = iboffv + icol2Notecn;
//... mcol2_noteTitle.setText(Col2Note);
}
// 。。。。。。。
}
--- String 转 byte
byte[] tmpRbyteArr = new byte[288];
int[] daparv = new int[18];
String Col1Name = "名称";
byte[] byteName = Col1Name.getBytes();
int iclen = byteName.length;
if(iclen > 26) iclen = 26;
for(int jb = 0;jb < iclen;jb++) tmpRbyteArr[jb+1] = byteName[jb];
int iboffv = 1+iclen;
daparv[0] = iclen;
String Col2Note = "备注";
byte[] byteNote = Col2Note.getBytes();
iclen = byteNote.length;
if(iclen > 26) iclen = 26;
for(int jb = 0;jb < iclen;jb++) tmpRbyteArr[jb+iboffv] = byteNote[jb];
daparv[1] = iclen;
int iretItemNum = ActEventDataClass.JavaJNIgetSetNoteBookItem(NOTEBOOK_UPDATEHEADCOLNAME,daparv,-1,tmpRbyteArr,280);
二,JNI调用C++/C部分
由于APP中的C++/c 部分是个比较大的数据管理系统,因此将“JNI调用C++/C”做为了单独部分。通过C++类指针进行操作。
#include <jni.h>
#include "eventManager.h"
#include <string>
#include <stdio.h>
#include <dirent.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <android/bitmap.h>
#include <android/asset_manager_jni.h>
#include <android/asset_manager.h>
// CPP class 2019.10.10 by bs60 create
static eventManager* pEventManager = NULL;
// JNI Call interface
extern "C" JNIEXPORT int JNICALL
Java_com_bi3eview_newstart60_local_JavaLoadCppLib_ActEventDataClass_Start
(JNIEnv * env, jobject obj){
if(pEventManager == NULL){
pEventManager = new eventManager();
if(pEventManager != NULL){
pEventManager->initSet();
}
}
return 0;
}
extern "C" JNIEXPORT int JNICALL
Java_com_bi3eview_newstart60_local_JavaLoadCppLib_ActEventDataClass_JNIsaveSsysData
(JNIEnv * env, jobject obj){
int iretv = -3;
if(pEventManager != NULL){
iretv =pEventManager->SaveAppSysData();
}
return iretv;
}
extern "C" JNIEXPORT int JNICALL
Java_com_bi3eview_newstart60_local_JavaLoadCppLib_ActEventDataClass_JNIgetRecordEventViewDataLst
(JNIEnv * env, jobject obj,jint icobjkd,jintArray RintArr,jint idajno,jbyteArray RbyteArr,jint jmaxByten) {
int iretv = 0;
jsize len = env->GetArrayLength(RintArr);
if(NULL != pEventManager && len >= 6){
jint* c_RintArr = env->GetIntArrayElements(RintArr, NULL);
jbyte* pArraydata = env->GetByteArrayElements(RbyteArr,0);
iretv = pEventManager->GetRecordEventViewDataLst(icobjkd,c_RintArr,idajno,pArraydata,jmaxByten);
env->ReleaseIntArrayElements(RintArr, c_RintArr, 0);
env->ReleaseByteArrayElements(RbyteArr,pArraydata,0);
}
return iretv;
}
// task and share data parameter model ----- 2021.02.21-----------
extern "C" JNIEXPORT int JNICALL
Java_com_bi3eview_newstart60_local_JavaLoadCppLib_ActEventDataClass_JNIgetSetDataParaModelInfo
(JNIEnv * env, jobject obj,jint icobjkd,jintArray RintArr,jint idajno,jbyteArray RbyteArr,jint jmaxByten) {
int iretv = 0;
jsize len = env->GetArrayLength(RintArr);
if(NULL != pEventManager && len >= 2){
jint* c_RintArr = env->GetIntArrayElements(RintArr, NULL);
jbyte* pArraydata = env->GetByteArrayElements(RbyteArr,0);
iretv = pEventManager->GetSetDataParaModelInfo(icobjkd,c_RintArr,idajno,pArraydata,jmaxByten);
env->ReleaseIntArrayElements(RintArr, c_RintArr, 0);
env->ReleaseByteArrayElements(RbyteArr,pArraydata,0);
}
return iretv;
}
// person data ----- 2021.07.02 ------------
extern "C" JNIEXPORT int JNICALL
Java_com_bi3eview_newstart60_local_JavaLoadCppLib_ActEventDataClass_JNIgetSetPersonDataItem
(JNIEnv * env, jobject obj,jint icobjkd,jintArray RintArr,jint idajno,jbyteArray RbyteArr,jint jmaxByten) {
int iretv = 0;
jsize len = env->GetArrayLength(RintArr);
if(NULL != pEventManager && len >= 2){
jint* c_RintArr = env->GetIntArrayElements(RintArr, NULL);
jbyte* pArraydata = env->GetByteArrayElements(RbyteArr,0);
iretv = pEventManager->GetSetPersonDataItem(icobjkd,c_RintArr,idajno,pArraydata,jmaxByten);
env->ReleaseIntArrayElements(RintArr, c_RintArr, 0);
env->ReleaseByteArrayElements(RbyteArr,pArraydata,0);
}
return iretv;
}
extern "C" JNIEXPORT int JNICALL
Java_com_bi3eview_newstart60_local_JavaLoadCppLib_ActEventDataClass_JNIgetSetDoubleValueDaItem
(JNIEnv * env, jobject obj,jint icobjkd,jdoubleArray RdoubleArr,jint idajno,jbyteArray RbyteArr,jint jmaxByten) {
int iretv = 0;
jsize len = env->GetArrayLength(RdoubleArr);
if(NULL != pEventManager && len >= 2){
jdouble* d_RdoubleArr = env->GetDoubleArrayElements(RdoubleArr, NULL);
jbyte* pArraydata = env->GetByteArrayElements(RbyteArr,0);
iretv = pEventManager->GetSetDoubleValueDaItem(icobjkd,d_RdoubleArr,idajno,pArraydata,jmaxByten);
env->ReleaseDoubleArrayElements(RdoubleArr, d_RdoubleArr, 0);
env->ReleaseByteArrayElements(RbyteArr,pArraydata,0);
}
return iretv;
}
// dbase unit ----- 2021.07.19 ------------
extern "C" JNIEXPORT int JNICALL
Java_com_bi3eview_newstart60_local_JavaLoadCppLib_ActEventDataClass_JNIgetSetDbaseUnitItem
(JNIEnv * env, jobject obj,jint icobjkd,jintArray RintArr,jint idajno,jbyteArray RbyteArr,jint jmaxByten) {
int iretv = 0;
jsize len = env->GetArrayLength(RintArr);
if(NULL != pEventManager && len >= 2){
jint* c_RintArr = env->GetIntArrayElements(RintArr, NULL);
jbyte* pArraydata = env->GetByteArrayElements(RbyteArr,0);
iretv = pEventManager->GetSetDbaseUnitItem(icobjkd,c_RintArr,idajno,pArraydata,jmaxByten);
env->ReleaseIntArrayElements(RintArr, c_RintArr, 0);
env->ReleaseByteArrayElements(RbyteArr,pArraydata,0);
}
return iretv;
}
// dbase text ----- 2021.10.30 ------------
extern "C" JNIEXPORT int JNICALL
Java_com_bi3eview_newstart60_local_JavaLoadCppLib_ActEventDataClass_JNIgetSetDbaseTextItem
(JNIEnv * env, jobject obj,jint icobjkd,jintArray RintArr,jint idajno,jbyteArray RbyteArr,jint jmaxByten) {
int iretv = 0;
jsize len = env->GetArrayLength(RintArr);
if(NULL != pEventManager && len >= 2){
jint* c_RintArr = env->GetIntArrayElements(RintArr, NULL);
jbyte* pArraydata = env->GetByteArrayElements(RbyteArr,0);
iretv = pEventManager->GetSetDbaseTextItem(icobjkd,c_RintArr,idajno,pArraydata,jmaxByten);
env->ReleaseIntArrayElements(RintArr, c_RintArr, 0);
env->ReleaseByteArrayElements(RbyteArr,pArraydata,0);
}
return iretv;
}
extern "C" JNIEXPORT int JNICALL
Java_com_bi3eview_newstart60_local_JavaLoadCppLib_ActEventDataClass_JNIcheckAssetFileIfExist
(JNIEnv * env, jobject obj,jobject assetManager, jstring dataFileName) {
int iretv = -1;
if(NULL != pEventManager){
AAssetManager* mManeger = AAssetManager_fromJava(env, assetManager);
jboolean iscopy;
const char *dataFile = env->GetStringUTFChars(dataFileName, &iscopy);
//open file
AAsset *assetFile = AAssetManager_open(mManeger, dataFile, AASSET_MODE_BUFFER);
if(assetFile != NULL){
iretv = 1;
AAsset_close(assetFile);
}
env->ReleaseStringUTFChars(dataFileName, dataFile);
}
return iretv;
}
// note book
extern "C" JNIEXPORT int JNICALL
Java_com_bi3eview_newstart60_local_JavaLoadCppLib_ActEventDataClass_JNIgetSetNoteBookItem
(JNIEnv * env, jobject obj,jint icobjkd,jintArray RintArr,jint idajno,jbyteArray RbyteArr,jint jmaxByten) {
int iretv = 0;
jsize len = env->GetArrayLength(RintArr);
if(NULL != pEventManager && len >= 6){
jint* c_RintArr = env->GetIntArrayElements(RintArr, NULL);
jbyte* pArraydata = env->GetByteArrayElements(RbyteArr,0);
iretv = pEventManager->GetSetNoteBookItem(icobjkd,c_RintArr,idajno,pArraydata,jmaxByten);
env->ReleaseIntArrayElements(RintArr, c_RintArr, 0);
env->ReleaseByteArrayElements(RbyteArr,pArraydata,0);
}
return iretv;
}
// 。。。。。。。。。。
// test remain example 2019.10.09 ------------------------------------------
extern "C" JNIEXPORT jstring JNICALL
Java_com_bi3eview_newstart60_local_JavaLoadCppLib_ActEventDataClass_stringFromJNI
(JNIEnv* env, jobject obj) {
std::string hello = "Hello from JNI C++ 2019.09.09 ";
return env->NewStringUTF(hello.c_str());
}
extern "C" JNIEXPORT jstring JNICALL
Java_com_bi3eview_newstart60_local_JavaLoadCppLib_ActEventDataClass_createFileFromJNI(
JNIEnv *env,
jobject obj) {
std::string hello = "Hello from C++";
char *strDirPath="D:/test/test1/test2";
mkdir(strDirPath,0775);
FILE* file = NULL;
file = fopen("/data/data/com.example.clientfile/hello.txt","a"); //创建文件
if(file == NULL){ //容错
// LOG_D("文件创建失败%s","222");
}
fwrite("1111",3,1,file); //往文件中写文件
fclose(file); //关闭文件
return env->NewStringUTF(hello.c_str());
}
"eventManager"类的的部分代码。
//
// Created by hufz on 2019/10/7.
//
#ifndef BIDAEVIEWCYBORG_EVENTMANAGER_H
#define BIDAEVIEWCYBORG_EVENTMANAGER_H
#include <jni.h>
#include <android/log.h>
#include <stdio.h>
#include <sys/time.h>
#include <math.h>
#include <stdlib.h>
#include<string.h>
#include "eventShare_struct.h"
#include "eventDetail.h"
#include "netShareBook.h"
#include "publishTaskrec.h"
#include "finishTaskRecord.h"
#include "AccountTaskInfo.h"
#include "Account2Notify.h"
#include "AccountNetpal.h"
#include "taskCheckDataLst.h"
#include "PersonData.h"
#include "pcDbaseUnit.h"
#include "modelEvent.h"
#include "noteBook.h"
#include "ClockIn.h"
#include "pcDbaseComText.h"
/**
* create by bs60 on 2019.9.23
*/
// event manager class
class eventManager {
static const int EVENTMAXJN = 30;
static const int CHARBULISTAXJN = EVENTMAXJN*6;
static const int LONGCHARBULISTAXJN = EVENTMAXJN*3;
static const int TASKLISTMAXJN = EVENTMAXJN*8;
static const int EVENTNAME_MAXN = 20;
static const int EVENTNOTE_MAXN = 40;
static const int EVENTFIND_ONIDNO = 1234567;
static const int TASKACTIVE_MAXNUM = 200;
static const int EDITEVENTTASK_MAXNUM = 100;
static const int PRIVATEDATALIST_MAXNUM = 5;
// 。。。。。。。。。。。。。。。
public:
eventManager();
~eventManager();
void init();
void destroy();
int exitSaveData();
int SaveAppSysData();
// 。。。。。。。。。。。。。。。。
private:
int checkBasicWorkDir(char* SDcardp, int iclen);
int LoadEventManagerList(char* eventManagerfile);
int CreateBasicEventManagerLis(char* eventManagerfile);
int CreateBasicEventOldManagerLis(char* eventManagerfile);
static int get_file_size_time(const char *filename);
static int ReadDirFile(const char *dirname);
void initEventDetailData(EVENTMANAGERDETAIL* pEventDetail);
unsigned short buildCharNameList(char* strName);
unsigned short UpdateSetCharNameList(int ioldcharposj,jbyte* cretItemcp,int maxcn);
int createEventSoreDir(char* dirName);
int getCharListContext(int icharLstj,jbyte* cretItemcp,int maxcn,int ioffv);
int appendBuildContext(int igetStposj,jbyte* getItemcp,int maxcn,char* starMark,char* char2next,int chindexcp,char* endMark);
int AppendCharListContext(char* newChar,int inewposj,jbyte* cretItemcp,int maxcn);
// 。。。。。。。。。。。。。。。。。。。。。
};
#endif //BIDAEVIEWCYBORG_EVENTMANAGER_H
//
// Created by bs60 on 2019/10/7.
//
#include "eventManager.h"
#include "commonBitconvert.h"
#include<string.h>
#include<stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/time.h>
#include <dirent.h>
#include <cstddef>
#include <fcntl.h>
#include <time.h>
// eventManager class function
eventManager::eventManager() {
init();
}
eventManager::~eventManager() {
}
int eventManager::exitSaveData()
{
// "/EVENTMANAGER.h60"
int icns2 = sizeof(EVENTMANAGERFILE);
char* appWorksubdir2 = new char[icns2+miSysDataDirlen];
for(int jc = 0;jc < miSysDataDirlen;jc++) *(appWorksubdir2+jc) = *(curSysDataDirMembuf+jc);
for(int jc = 0;jc < icns2;jc++) *(appWorksubdir2+jc+miSysDataDirlen) = EVENTMANAGERFILE[jc];
int iretv = saveEventMangerFile(appWorksubdir2);
// "/CYBERTASKREC.c60"
icns2 = sizeof(CYBERTASKRECFILE);
char* cyberTaskFile = new char[icns2+miNetShareDirlen];
for(int jc = 0;jc < miNetShareDirlen;jc++) *(cyberTaskFile+jc) = *(curNetshareDirMembuf+jc);
for(int jc = 0;jc < icns2;jc++) *(cyberTaskFile+jc+miNetShareDirlen) = CYBERTASKRECFILE[jc];
saveCyberTaskFile(cyberTaskFile);
// "/CYBERADDRSITE.s60"
saveCyber2AddrFile(mSysCyberAddrRECFilepath);
free(cyberTaskFile);
free(appWorksubdir2);
if(ebuffer != NULL){
free(ebuffer);
}
if(curDownloadDirMembuf != NULL){
free(curDownloadDirMembuf);
}
if(curSysDataDirMembuf != NULL){
free(curSysDataDirMembuf);
}
if(curEditPictureDirMembuf != NULL){
free(curEditPictureDirMembuf);
}
if(curPersonDataDirMembuf != NULL){
free(curPersonDataDirMembuf);
}
if(curNoteBookDirMembuf != NULL){
free(curNoteBookDirMembuf);
}
if(curClockinSpaceDirMembuf != NULL){
free(curClockinSpaceDirMembuf);
}
if(curEventStoreDirMembuf != NULL){
free(curEventStoreDirMembuf);
}
if(curNetshareDirMembuf != NULL){
free(curNetshareDirMembuf);
}
if(curSoundDirMembuf != NULL){
free(curSoundDirMembuf);
}
if(curPictureDirMembuf != NULL){
free(curPictureDirMembuf);
}
if(dataHead.actTaskMemNum > 0){
for(int j = 0;j < dataHead.actTaskMemNum;j++){
if(activeTaskLst[j].actStruct != NULL) free(activeTaskLst[j].actStruct);
}
}
if(mcombox_head.itemNum > 0){
for(int j = 0;j < mcombox_head.itemNum;j++){
if(mcombox_ItemLst[j].charbuff != NULL) free(mcombox_ItemLst[j].charbuff);
}
}
if(mp_eventRecord != NULL)
free(mp_eventRecord);
if(mp_NetpalShare != NULL){
mp_NetpalShare->ReleaseShareAllSpace();
free(mp_NetpalShare);
}
if(mp_publishTaskrec != NULL){
mp_publishTaskrec->saveDataFreeSpace();
free(mp_publishTaskrec);
}
if(mp_accountTaskinfo != NULL){
mp_accountTaskinfo->saveDataFreeSpace();
free(mp_accountTaskinfo);
}
if(mp_accountNotify != NULL){
mp_accountNotify->saveDataFreeSpace();
free(mp_accountNotify);
}
if(mp_accountNetpal != NULL){
mp_accountNetpal->saveDataFreeSpace();
free(mp_accountNetpal);
}
if(mp_taskDataCheck != NULL){
mp_taskDataCheck->FreeDataSpace();
free(mp_taskDataCheck);
}
if(mp_personData != NULL){
mp_personData->closeFileFreeSpace();
free(mp_personData);
}
if(mp_pcDbaseUnit != NULL){
mp_pcDbaseUnit->freeSpaceCloseFile(-1);
free(mp_pcDbaseUnit);
}
if(mp_pcDbaseText != NULL){
mp_pcDbaseText->freeSpaceCloseFile(-1);
free(mp_pcDbaseText);
}
if(mp_modelEvent != NULL){
mp_modelEvent->freeSpaceCloseFile(-1);
free(mp_modelEvent);
}
if(mp_noteBook != NULL){
mp_noteBook->freeSpaceCloseFile(-1);
free(mp_noteBook);
}
if(mp_ClockIn != NULL){
mp_ClockIn->closeFileFreeSpace();
free(mp_ClockIn);
}
return iretv;
}
void eventManager::init() {
mwk_NetpalShare = NETPALSHARE_NETPAL;
mwk_shareNetpalIDno = -1;
mwk_curNetpalIDno = -9;
mAdvancedCtrl = 0;
mnet_operkd = 101;
mcur_actComboxjno = -1;
mcurSDcardName[0] = '\0';
mShareMtitle[0] = '\0';
mCameraPicFilepath[0] = '\0';
mSysRunLogFilepath[0] = '\0';
mSysCyberAddrRECFilepath[0] = '\0';
mWebCyberAddrRECFilepath[0] = '\0';
mCameraPickind = 0;
mtrack_CHECKINFO[0] = '\0';
//... sprintf(mtrack_CHECKINFO,"%s","init OK!");
mtask_reUpdatej = 0;
m_curSelEdtEventjno = -1;
mfinish_ctrlblv = false;
ymonth_days[0] = 31;// ={31,28,31,30,31,30,31,31,30,31,30,31,0};
ymonth_days[1] = 28;
ymonth_days[2] = 31;
ymonth_days[3] = 30;
ymonth_days[4] = 31;
ymonth_days[5] = 30;
ymonth_days[6] = 31;
ymonth_days[7] = 31;
ymonth_days[8] = 30;
ymonth_days[9] = 31;
ymonth_days[10] = 30;
ymonth_days[11] = 31;
mp_eventRecord = NULL;
mMANAGERDataChagnehblv = false;
mcur_finishTaskblv = false;
// test Bit operation
/* unsigned char byte8 = 0x55;
setbit(byte8,2);
clrbit(byte8,3);
int ibit = getbit(byte8,3); */
// init set
ebuffer = (unsigned char *) malloc(EBUFFMAXSIZE);
if(ebuffer != NULL){
*(ebuffer+0) = 'A';
for(int je = 0;je < EBUFFMAXSIZE;je++) *(ebuffer+je) = 'a';
}
mebufstcp = 0;
dataHead.eventFmtc = '1';// '1':image,'2':card
dataHead.tc1 = ' ';
dataHead.tc2 = ' ';
dataHead.curPrivatejno = 0;
dataHead.curNowYear = 0;
dataHead.curEventnum = 0;
dataHead.privateNum = 0;
dataHead.taskDetailListNum = 1;
dataHead.actTaskMemNum = 0;
dataHead.buffstcp = 1;// 0:empty
dataHead.charListNum = 1;// 0:empty
dataHead.longCharListNum = 1;// 0:empty
dataHead.smartEventIDno = 100;
dataHead.taskIDno = 101;
curTaskActiveNum = 0;
m_actTaskIndLstMaxnum = 0;
mcur_finishTaskIDno = -1;
for(int j = 0;j < 12;j++){
dataHead.yearMonthWorkDay[j] = 0;
dataHead.yearMonthFestivalDay[j] = 0;
dataHead.yearMonthNextWorkDay[j] = 0;
dataHead.yearMonthNextFestivalDay[j] = 0;
dataHead.yearMonthWorkNt1Day[j] = 0;
dataHead.yearMonthWorkNt2Day[j] = 0;
}
for(int j = 0;j < TASKACTIVE_MAXNUM;j++){
activeTaskLst[j].status = 'N';
activeTaskLst[j].actStruct = NULL;
}
for(int j = 0;j < COMBOXITEMMAXJN;j++){
mcombox_ItemLst[j].charnum = 0;
mcombox_ItemLst[j].charbuff = NULL;
}
// cyber task
mCyberTaskHead.verc = 'A';
mCyberTaskHead.detailjn = 0;
mCyberTaskHead.icharbytenum = 0;
for(int j = 0;j < CYBERTASKMAXJN;j++){
mcyberTaskDetail[j].status = ' ';
mcyberTaskDetail[j].namecn = 0;
mcyberTaskDetail[j].secretcn = 0;
mcyberTaskDetail[j].soundfgc = ' ';
mcyberTaskDetail[j].picturec = ' ';
mcyberTaskDetail[j].tabheadcn = 0;
mcyberTaskDetail[j].contextcn = 0;
mcyberTaskDetail[j].icharbytecp = -1;
mcyberTaskDetail[j].stDatetime = 0;
mcyberTaskDetail[j].edDatetime = 0;
mcyberTaskDetail[j].cyberTaskIDno = 0;
}
// cyber net list
m_curCyberIDno_finish = -1;
mCyberAddrLstHead.verno = 'A';
mCyberAddrLstHead.INFO2Lstnum = 0;
mCyberAddrLstHead.activeCyberno = 0;
mCyberAddrLstHead.cyberIDno = 100;
for(int j = 0;j < CYBERADDRLSTMAXJN;j++){
mcyberAddrLstDetail[j].cyberkd = ' ';
mcyberAddrLstDetail[j].status = ' ';
mcyberAddrLstDetail[j].onlinec = ' ';// online:'Y';
mcyberAddrLstDetail[j].autocyber = ' ';
mcyberAddrLstDetail[j].regMark = ' ';
mcyberAddrLstDetail[j].savepassc = ' ';
mcyberAddrLstDetail[j].permission_sharec = ' ';// share:'Y';
mcyberAddrLstDetail[j].permission_pulishTaskc = ' ';// Publish task:'Y';
mcyberAddrLstDetail[j].permission_receiveTaskc = ' ';// Receive task:'Y';
mcyberAddrLstDetail[j].phonenumc[0] = '\0';
mcyberAddrLstDetail[j].username[0] = '\0';
mcyberAddrLstDetail[j].password[0] = '\0';
mcyberAddrLstDetail[j].ipAddress[0] = '\0';
mcyberAddrLstDetail[j].port[0] = '\0';
mcyberAddrLstDetail[j].netname[0] = '\0';
mcyberAddrLstDetail[j].cyberID = 0;
}
mcyberTaskchgblv = false;
// initiaze build event
eventClothblv = true;
evenEatblv = true;
evenTravelblv = true;
evenHealthblv = true;
evenShoppingblv = true;
evenChildblv = true;
evenMyworkblv = true;
evenFriendCallblv = true;
dataExtblv = false;
m_curEdtEventTaskJnum = 0;
mp_NetpalShare = NULL;// new netShareBook();
mp_publishTaskrec = NULL;
mp_finishTaskrec = NULL;
mp_accountTaskinfo = NULL;
mp_accountNotify = NULL;
mp_accountNetpal = NULL;
mp_taskDataCheck = NULL;
mp_personData = NULL;
mp_pcDbaseUnit = NULL;
mp_pcDbaseText = NULL;
mp_modelEvent = NULL;
mp_ClockIn = NULL;
mp_noteBook = NULL;
m_curOpenlEViewIDno = 0;
}
void eventManager::destroy() {
}
三, CMakeLists
# For more information about using CMake with Android Studio, read the
# documentation: https://d.android.com/studio/projects/add-native-code.html
# Sets the minimum version of CMake required to build the native library.
cmake_minimum_required(VERSION 3.4.1)
# Creates and names a library, sets it as either STATIC
# or SHARED, and provides the relative paths to its source code.
# You can define multiple libraries, and CMake builds them for you.
# Gradle automatically packages shared libraries with your APK.
add_library( # Sets the name of the library.
comtools-lib
# Sets the library as a shared library.
SHARED
# Provides a relative path to your source file(s).
src/main/cpp/global_para.cpp /
src/main/cpp/copy_write.cpp /
src/main/cpp/global_para_JNI.cpp
src/main/cpp/CppByteNetSerial.cpp /
src/main/cpp/JNICallNetSerial.cpp )
add_library( # Sets the name of the library.
ActEventData-lib
# Sets the library as a shared library.
SHARED
# Provides a relative path to your source file(s).
src/main/cpp/eventDetail.cpp /
src/main/cpp/eventDataDetail.cpp /
src/main/cpp/eventManager.cpp /
src/main/cpp/eventManager_cybertask.cpp /
src/main/cpp/eventManager_sharebook.cpp /
src/main/cpp/netShareBook.cpp /
src/main/cpp/publishTaskrec.cpp /
src/main/cpp/finishTaskRecord.cpp /
src/main/cpp/eventManager_publishtask.cpp /
src/main/cpp/eventManager_accountinfo.cpp /
src/main/cpp/eventManager_accountNotify.cpp /
src/main/cpp/eventManager_accountNetpal.cpp /
src/main/cpp/AccountTaskInfo.cpp /
src/main/cpp/Account2Notify.cpp /
src/main/cpp/AccountNetpal.cpp /
src/main/cpp/taskCheckDataLst.cpp /
src/main/cpp/PersonData.cpp /
src/main/cpp/pcDbaseUnit.cpp /
src/main/cpp/pcDbaseComText.cpp /
src/main/cpp/eventManager_pcDbase.cpp /
src/main/cpp/eventManager_personData.cpp /
src/main/cpp/eventManager_model.cpp /
src/main/cpp/eventManager_modelEvent.cpp /
src/main/cpp/modelEvent.cpp /
src/main/cpp/eventManager_noteBook.cpp /
src/main/cpp/noteBook.cpp /
src/main/cpp/eventManager_ClockIn.cpp /
src/main/cpp/ClockIn.cpp /
src/main/cpp/eventManager_JNI.cpp )
# Searches for a specified prebuilt library and stores the path as a
# variable. Because CMake includes system libraries in the search path by
# default, you only need to specify the name of the public NDK library
# you want to add. CMake verifies that the library exists before
# completing its build.
find_library( # Sets the name of the path variable.
log-lib
# Specifies the name of the NDK library that
# you want CMake to locate.
log )
# Specifies libraries CMake should link to your target library. You
# can link multiple libraries, such as libraries you define in this
# build script, prebuilt third-party libraries, or system libraries.
target_link_libraries( # Specifies the target library.
ActEventData-lib
comtools-lib
#lib to link
android
# other libs
# Links the target library to the log library
# included in the NDK.
${log-lib} )