package com.jni;
public class JNITest {
static{
System.loadLibrary("JNI");
}
public native String getCompterName();
public native void fastWriteFile(String name, byte[] bytes);
public static void main(String[] args) {
JNITest test = new JNITest();
String str = test.getCompterName();
test.fastWriteFile("tst", new byte[]{});
System.out.println(str);
}
}
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_jni_JNITest */
#ifndef _Included_com_jni_JNITest
#define _Included_com_jni_JNITest
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_jni_JNITest
* Method: getCompterName
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_jni_JNITest_getCompterName
(JNIEnv *, jobject);
/*
* Class: com_jni_JNITest
* Method: fastWriteFile
* Signature: (Ljava/lang/String;[B)V
*/
JNIEXPORT void JNICALL Java_com_jni_JNITest_fastWriteFile
(JNIEnv *, jobject, jstring, jbyteArray);
#ifdef __cplusplus
}
#endif
#endif
//-------------------------------------
/* Replace "dll.h" with the name of your header */
#include <stdlib.h>
#include <stdio.h>
#include "dll.h"
#include "windows.h"
#include "tlhelp32.h"
#include "util.h"
/*
* Class: com_jni_JNITest
* Method: getCompterName
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_jni_JNITest_getCompterName
(JNIEnv *env, jobject)
{
char *res = "test to jstring";
PROCESSENTRY32 pe32;
//在使用这个结构前,先设置它的大小
pe32.dwSize = sizeof(pe32);
//给系统内所有的进程拍个快照
HANDLE hProcessSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
if (hProcessSnap == INVALID_HANDLE_VALUE)
{
res = "CreateToolhelp32Snapshot 调用失败.
";
}
//遍历进程快照,轮流显示每个进程的信息
BOOL bMore = ::Process32First(hProcessSnap,&pe32);
while (bMore)
{
printf("进程名称:%s ID:%u
",pe32.szExeFile,pe32.th32ProcessID);
bMore = ::Process32Next(hProcessSnap,&pe32);
}
//不要忘记清除掉snapshot对象
::CloseHandle(hProcessSnap);
jstring result = stoJstring(env,res);
return result;
}
/*
* Class: com_jni_JNITest
* Method: fastWriteFile
* Signature: (Ljava/lang/String;[B)V
*/
JNIEXPORT void JNICALL Java_com_jni_JNITest_fastWriteFile
(JNIEnv *env, jobject, jstring, jbyteArray)
{
printf("hello jni");
}
//-------------------------
#include <stdlib.h>
#include <stdio.h>
#include "dll.h"
//char* to jstring
jstring stoJstring(JNIEnv* env, const char* pat)
{
jclass strClass = env->FindClass("Ljava/lang/String;");
jmethodID ctorID = env->GetMethodID(strClass, "<init>", "([BLjava/lang/String;)V");
jbyteArray bytes = env->NewByteArray(strlen(pat));
env->SetByteArrayRegion(bytes, 0, strlen(pat), (jbyte*)pat);
jstring encoding = env->NewStringUTF("utf-8");
return (jstring)env->NewObject(strClass, ctorID, bytes, encoding);
}
char* jstringTostring(JNIEnv* env, jstring jstr)
{
char* rtn = NULL;
jclass clsstring = env->FindClass("java/lang/String");
jstring strencode = env->NewStringUTF("utf-8");
jmethodID mid = env->GetMethodID(clsstring, "getBytes", "(Ljava/lang/String;)[B");
jbyteArray barr= (jbyteArray)env->CallObjectMethod(jstr, mid, strencode);
jsize alen = env->GetArrayLength(barr);
jbyte* ba = env->GetByteArrayElements(barr, JNI_FALSE);
if (alen > 0)
{
rtn = (char*)malloc(alen + 1);
memcpy(rtn, ba, alen);
rtn[alen] = 0;
}
env->ReleaseByteArrayElements(barr, ba, 0);
return rtn;
}
编译请参考:http://www.cnblogs.com/czpblog/p/3760940.html
编译后把dll的目录追加到path