NotOnlyJava

http://www.ibm.com/developerworks/cn/java/j-lo-serial/
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

JNIdemo

Posted on 2014-05-30 14:37  NotOnlyJava  阅读(190)  评论(0编辑  收藏  举报
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 调用失败.\n"; 
} 
//遍历进程快照,轮流显示每个进程的信息 
BOOL bMore = ::Process32First(hProcessSnap,&pe32); 
while (bMore) 
{ 
printf("进程名称:%s ID:%u\n",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