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 + -
显示快捷键?