testimp.cpp
来自「I always wanted to play around with JNI.」· C++ 代码 · 共 644 行 · 第 1/2 页
CPP
644 行
// TestImp.cpp : Defines the entry point for the DLL application.
/*
This code is freeware please modify it! Use of
this code is at you own risk.
*/
#include "stdafx.h"
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <io.h>
#include <stdio.h>
#include "Test.h"
#include "tlhelp32.h"
#include <process.h>
#define ARRAY_REALLOC_SIZE 20
// Exported function
JNIEXPORT void JNICALL Java_Test_print(JNIEnv *env, jobject obj, jstring msg)
{
const char *str = env->GetStringUTFChars(msg, 0);
printf("%s\n", str);
env->ReleaseStringUTFChars(msg, str);
}
// Exported function
JNIEXPORT jint JNICALL Java_Test_searchFile(JNIEnv * env, jobject obj, jstring _path, jbyteArray _bytePattern, jint bytePatternLength)
{
const signed char *bytePattern = env->GetByteArrayElements(_bytePattern, false);
struct stat finfo;
jint pos = -1;
const char *path = env->GetStringUTFChars(_path, 0);
//printf("Opening %s to search for %s\n", path, (char *) bytePattern);
int fd = _open(path, O_RDONLY|_O_BINARY);
if (fd == pos)
{
env->ReleaseStringUTFChars(_path, path);
return pos;
}
stat(path, &finfo);
env->ReleaseStringUTFChars(_path, path);
HLOCAL buffer = LocalAlloc(LPTR, finfo.st_size);
if(buffer == NULL)
{
return pos;
}
if(_read(fd, (unsigned char *) buffer, finfo.st_size) == finfo.st_size)
{
int cp = 0;
while(cp < finfo.st_size)
{
unsigned char *pdest = (unsigned char *) memchr(((unsigned char *) buffer + cp), (int) *bytePattern, finfo.st_size - cp);
if(pdest != NULL)
{
cp = (pdest - ((unsigned char *) buffer));
//printf("found a %c at %d\n", *bytePattern, cp);
}
if((memcmp((((unsigned char *) buffer) + cp), bytePattern, bytePatternLength) == 0))
{
//printf("->%s=%s\n", (char *) bytePattern, (char *) (((unsigned char *) buffer) + cp));
LocalFree(buffer);
pos = cp;
return pos;
}
cp++;
}
LocalFree(buffer);
return pos;
}
else
{
LocalFree(buffer);
return pos;
}
}
// Exported function
JNIEXPORT jbyteArray JNICALL Java_Test_readFile(JNIEnv *env, jobject obj, jstring _path)
{
struct stat finfo;
jbyteArray jb;
const char *path = env->GetStringUTFChars(_path, 0);
int fd = _open(path, O_RDONLY|_O_BINARY);
if (fd == -1)
{
return NULL;
}
stat(path, &finfo);
HLOCAL buffer = LocalAlloc(LPTR, finfo.st_size);
if(buffer == NULL)
{
env->ReleaseStringUTFChars(_path, path);
return NULL;
}
if(_read(fd, (unsigned char *) buffer, finfo.st_size) == finfo.st_size)
{
jb = env->NewByteArray(finfo.st_size);
env->SetByteArrayRegion(jb, 0, finfo.st_size, (jbyte *) buffer);
env->ReleaseStringUTFChars(_path, path);
LocalFree(buffer);
return jb;
}
else
{
LocalFree(buffer);
return NULL;
}
}
// Internal function
jobjectArray reallocateStringArray(JNIEnv * env, jobjectArray old, int newSize)
{
jclass cl;
jobjectArray array;
cl = env->FindClass("java/lang/String");
if(cl == 0)
{
return NULL;
}
array = env->NewObjectArray(newSize, cl, 0);
if(array == 0)
{
return NULL;
}
// Copy the old elements
for(int x = 0; ((x < env->GetArrayLength(old)) && (x < newSize)); x++)
{
env->SetObjectArrayElement(array, x, env->GetObjectArrayElement(old, x));
}
return array;
}
// Exported function
JNIEXPORT jobjectArray JNICALL Java_Test_findFiles(JNIEnv * env, jobject obj, jstring _path, jstring _mask)
{
const char *path = env->GetStringUTFChars(_path, 0);
const char *mask = env->GetStringUTFChars(_mask, 0);
WIN32_FIND_DATA FindFileData;
HANDLE hFind = NULL;
char pth[512] = {0};
strcpy(pth, path);
strcat(pth, "\\");
strcat(pth, mask);
int aSize = ARRAY_REALLOC_SIZE;
jclass cl;
jobjectArray array;
jstring string;
cl = env->FindClass("java/lang/String");
if(cl == 0)
{
env->ReleaseStringUTFChars(_path, path);
env->ReleaseStringUTFChars(_mask, mask);
return NULL;
}
array = env->NewObjectArray(aSize, cl, 0);
if(array == 0)
{
env->ReleaseStringUTFChars(_path, path);
env->ReleaseStringUTFChars(_mask, mask);
return NULL;
}
int count = 0;
if((hFind = FindFirstFile(pth, &FindFileData)) != INVALID_HANDLE_VALUE)
{
if(!(((FindFileData.cFileName[0] == '.') && (FindFileData.cFileName[1] == '\0')) ||
((FindFileData.cFileName[0] == '.') && (FindFileData.cFileName[1] == '.'))))
{
string = env->NewStringUTF(FindFileData.cFileName);
if(string == NULL)
{
env->ReleaseStringUTFChars(_path, path);
env->ReleaseStringUTFChars(_mask, mask);
return NULL;
}
env->SetObjectArrayElement(array, count++, string);
env->DeleteLocalRef(string);
//printf("->%s\n", FindFileData.cFileName);
}
while(FindNextFile(hFind, &FindFileData))
{
if(!(((FindFileData.cFileName[0] == '.') && (FindFileData.cFileName[1] == '\0')) ||
((FindFileData.cFileName[0] == '.') && (FindFileData.cFileName[1] == '.'))))
{
if(count == (aSize - 1))
{
array = reallocateStringArray(env, array, env->GetArrayLength(array) + ARRAY_REALLOC_SIZE);
if(array == NULL)
{
env->ReleaseStringUTFChars(_path, path);
env->ReleaseStringUTFChars(_mask, mask);
return NULL;
}
aSize += ARRAY_REALLOC_SIZE;
}
string = env->NewStringUTF(FindFileData.cFileName);
if(string == NULL)
{
env->ReleaseStringUTFChars(_path, path);
env->ReleaseStringUTFChars(_mask, mask);
return NULL;
}
env->SetObjectArrayElement(array, count++, string);
env->DeleteLocalRef(string);
//printf("->%s\n", FindFileData.cFileName);
}
}
FindClose(hFind);
}
env->ReleaseStringUTFChars(_path, path);
env->ReleaseStringUTFChars(_mask, mask);
// Fix the array
if(env->GetArrayLength(array) > count)
{
array = reallocateStringArray(env, array, count);
}
return array;
}
// Exported function
JNIEXPORT jobjectArray JNICALL Java_Test_checkProcess(JNIEnv * env, jobject obj, jstring _szToTerminate, jboolean _killIt, jboolean _printOutput)
{
BOOL bResult;
DWORD aiPID[1000];
DWORD iCb=1000;
DWORD iNumProc;
DWORD iV2000=0;
DWORD iCbneeded;
char szName[MAX_PATH];
char szToTermUpper[MAX_PATH];
HANDLE hProc;
OSVERSIONINFO osvi;
HINSTANCE hInstLib;
int iLen;
int iLenP;
HMODULE hMod;
jclass cl;
jobjectArray array;
jobjectArray array1;
jstring string;
const char *szToTerminate = env->GetStringUTFChars(_szToTerminate, 0);
cl = env->FindClass("java/lang/String");
if(cl == 0)
{
env->ReleaseStringUTFChars(_szToTerminate, szToTerminate);
return NULL;
}
// Transfer Process name into "szToTermUpper" and convert it to upper case
iLenP = strlen(szToTerminate);
if((iLenP < 1) || (iLenP > MAX_PATH))
{
env->ReleaseStringUTFChars(_szToTerminate, szToTerminate);
return NULL;
}
for(int indx = 0; indx < iLenP; indx++)
{
szToTermUpper[indx] = toupper(szToTerminate[indx]);
}
szToTermUpper[iLenP] = 0;
// PSAPI Function Pointers.
BOOL (WINAPI *lpfEnumProcesses)( DWORD *, DWORD cb, DWORD * );
BOOL (WINAPI *lpfEnumProcessModules)( HANDLE, HMODULE *, DWORD, LPDWORD );
DWORD (WINAPI *lpfGetModuleBaseName)( HANDLE, HMODULE, LPTSTR, DWORD );
// First, check what version of Windows we're in
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
bResult = GetVersionEx(&osvi);
if(! bResult) // Unable to identify system version
{
env->ReleaseStringUTFChars(_szToTerminate, szToTerminate);
return NULL;
}
// At present, we only support Win/NT/2000 or Win/9x
if((osvi.dwPlatformId != VER_PLATFORM_WIN32_NT) &&
(osvi.dwPlatformId != VER_PLATFORM_WIN32_WINDOWS))
{
env->ReleaseStringUTFChars(_szToTerminate, szToTerminate);
return NULL;
}
if(osvi.dwPlatformId == VER_PLATFORM_WIN32_NT)
{
// Win/NT or 2000
// Load library and get the procedures explicitly. We do
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?