初试JNI

         最近在看一本韩国人编写的关于Android框架的书《Android框架揭秘》,书中讲到JNI(Java Native Interface)。于是来了兴致尝试一下:

          首先试一下在Java中调用C语言编写的动态链接库(dll):

1:编写一个类,并编译之:

public class HelloJNI
{
	native void printHello();
	native void printString(String str);
	
	static{ System.loadLibrary("hellojni"); }
	
	public static void main(String args[])
	{
		HelloJNI myJNI=new HelloJNI();
		
		myJNI.printHello();
		myJNI.printString("Hello World.");
	}
}

 

 2:使用javah根据我们的java的.class文件产生C函数原型(头文件(.h文件)):

注:在这一步发生了问题,我本来是把HelloJNI.java放在E盘根目录下,却发生了Not a valid class name的错误,像这样:


初试JNI
 不知道是什么原因,解决办法也很搞笑,我把HelloJNI.java和HelloJNI.class放在javah同一目录下就好了,可能是环境变量的问题。



 执行成功后,产生了HelloJNI.h文件,文件内容是这样的:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class HelloJNI */

#ifndef _Included_HelloJNI
#define _Included_HelloJNI
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     HelloJNI
 * Method:    printHello
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_HelloJNI_printHello
  (JNIEnv *, jobject);

/*
 * Class:     HelloJNI
 * Method:    printString
 * Signature: (Ljava/lang/String;)V
 */
JNIEXPORT void JNICALL Java_HelloJNI_printString
  (JNIEnv *, jobject, jstring);

#ifdef __cplusplus
}
#endif
#endif

 

3.编写hellojni.c程序:

#include"HelloJNI.h"
#include<stdio.h>

JNIEXPORT void JNICALL Java_HelloJNI_printHello
  (JNIEnv *env, jobject obj)
  {
	printf("Hello World!\n");
	return;
  }
  
  JNIEXPORT void JNICALL Java_HelloJNI_printString
  (JNIEnv *env, jobject obj, jstring string)
  {
	const char *str=(*env)->GetStringUTFChars(env,string,0);
	printf("%s!\n",str);
	return;
  }

 

打来Visual Stdio 2005命令提示,产生dll:(要把HelloJNI.h拷贝到Visual Stdio 2005命令提示的同一目录下):


初试JNI
 4.最后一步,将生成的hellojni.dll放在HelloJNI.class同一目录下,并运行之:
初试JNI

初试JNI感觉不错,记录下来。
 

 

你可能感兴趣的:(jni)