/* _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ 【機能概要】 : Java言語アプリ用・共有メモリアクセスSR(JNIラッパー) 実際の共有メモリアクセスの実装は GG_SHM0011 であり、本アプリは Java言語とC++言語のインターフェース部分を実装している 【作成日】 : 2021.04.23 【呼出形式1】 : ShmStaticTable.SHM0001 ( byte[] in # 各パラメータを入力(パラメータ例は以下、\nコード区切り) # テーブルID / 検索ID / key1 / value1 / key2 / value2 ・・・ ) 【戻り値1】 : int # データ取得件数。但し、マイナス値はエラーコード 【呼出形式2】 : ShmStaticTable.SHM0001getData ( byte[] out # 返却データ格納領域を指定(各行は\n区切り) # 1行目:項目名(\t区切り)、2行目以降:データ値(\t区切り) ) 【戻り値2】 : void # なし _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ */ #include #include #include #include "GG_SHMCOM.h" #include "com_galaxygoby_ShmStaticTable.h" int GG_SHM0011_logic( int prmNum, char Prm[][ GG_SHM0001_MaxPrmLen ] ) ; void GG_SHM0011_getData ( char *arrOut ) ; /* _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ 共有メモリデータ検索処理 GG_SHM0011_logic(C++言語)を呼び出して、共有メモリデータの検索を行う。 Javaから受信したbyteデータをchar配列に分離して呼び出しを実行。 _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ */ JNIEXPORT jint JNICALL Java_com_galaxygoby_ShmStaticTable_SHM0001 (JNIEnv *env, jobject obj, jbyteArray in ) { int prmNum ; // パラメータ数 char Prm [ GG_SHM0001_MaxPrmNum ][ GG_SHM0001_MaxPrmLen ] ; // パラメータ char *savepoint ; // strtok_r用savepoint char szLogFileTmpPath [ MAX_PATH ] ; // XMLファイル名 char g_szLogFilePath [ MAX_PATH ] ; // ログファイル名 char szAccessDate [ 30 ] ; // YYYY-MM-DD HH:MM:SS.mmmmmm int ThreadId = (int)syscall(SYS_gettid) ; // スレッドIDの取得 // ログ出力場所の決定 getEnvString ( szLogFileTmpPath , "GG_LogFileName" , GG_SHM0011_LOGPATH , sizeof(szLogFileTmpPath) ); getLocalTimeString ( g_szLogFilePath , sizeof(g_szLogFilePath) , szLogFileTmpPath ) ; jbyte* arrIn = env->GetByteArrayElements(in,NULL); // jbyteArray型→jbyte型に変換 int nSize = env->GetArrayLength(in); // データ長取得 arrIn[nSize-1] = '\0' ; // ストッパー設定 /* _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ strtok_rを使用して、Javaの入力パラメータ(\n区切り)をGG_SHM0011_logic用の パラメータ形式(int prmNum, char Prm[])に変換 _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ */ char *tp ; for ( prmNum = 1 ;; prmNum++ ) { if ( prmNum == 1 ) { tp = strtok_r ( (char *)arrIn , "\n" , &savepoint ) ; } else { tp = strtok_r ( NULL , "\n" , &savepoint ) ; } if ( tp != NULL ) { strcpy ( Prm[prmNum] , tp ) ; getLocalTimeString ( szAccessDate , sizeof(szAccessDate), "%Y/%m/%d %H:%M:%S.%U" ) ; GG_MsgOut ( g_szLogFilePath , 9 , "(%05d) **** ( %s ) **** 入力パラメータ Prm[%d] = [%s] ****" , ThreadId , szAccessDate , prmNum , Prm[prmNum] ) ; } else { prmNum -- ; break ; } } // ログ出力 getLocalTimeString ( szAccessDate , sizeof(szAccessDate), "%Y/%m/%d %H:%M:%S.%U" ) ; GG_MsgOut ( g_szLogFilePath , 9 , "(%05d) **** ( %s ) **** 入力パラメータ数 prmNum = [ %d ]" , ThreadId , szAccessDate , prmNum ) ; int ret = GG_SHM0011_logic( prmNum, Prm ) ; // 共有メモリ検索処理を実行 env->ReleaseByteArrayElements(in, arrIn, 0); // arrIn を解放 return ( ret ) ; // 取得データ長を返却 } /* _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ 共有メモリデータ取得処理 GG_SHM0011_getData(C++言語)を呼び出して、共有メモリデータの取得を行う。 GG_SHM0011_logic(C++言語)で検索データ長が決定しているので、上位のJavaアプリ が用意した領域(out)に取得データを返却する _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ */ JNIEXPORT void JNICALL Java_com_galaxygoby_ShmStaticTable_SHM0001getData (JNIEnv *env, jobject obj, jbyteArray out ) { jbyte* arrOut = env->GetByteArrayElements(out,NULL); GG_SHM0011_getData ( (char *)arrOut ) ; /* getEnvString ( szLogFileTmpPath , "GG_LogFileName" , GG_SHM0011_LOGPATH , sizeof(szLogFileTmpPath) ); getLocalTimeString ( g_szLogFilePath , sizeof(g_szLogFilePath) , szLogFileTmpPath ) ; getLocalTimeString ( szAccessDate , sizeof(szAccessDate), "%Y/%m/%d %H:%M:%S.%U" ) ; GG_MsgOut ( g_szLogFilePath , 9 , "(%05d) **** ( %s ) **** 出力パラメータ out=[%s] ****" , ThreadId , szAccessDate , (char *)arrOut ) ; */ env->ReleaseByteArrayElements(out, arrOut, 0); // arrOutの解放 }