java本地方法通过jni连接至c函数

java本地方法通过jni连接至c函数
1.编写java代码.HelloJni.java

public class HelloJni {
	// 本地方法声明
	native void printHello();

	native void printString(String str);
	//加载库
	static {
		System.loadLibrary("hellojni");
	}
	
	public static void main(String[] args) {
		HelloJni helloJni=new HelloJni();
		//调用本地方法,实际上是调用的是使用c语言编写的JNI本地函数
		helloJni.printHello();
		helloJni.printString("在java中调用c");
	}

}

2.编译java代码.
使用命令:javac HelloJni.java,生成HelloJni.class文件。
3.生成c语言头文件.HelloJni.h
使用命令:javah HelloJni,其中HelloJni是上一步生成的class文件的名字。
4.编写c/c++代码。hellojni.c文件

#include "HelloJNI.h"
#include 
/**
 * Java_HelloJNI_printHelJo()函数对应于HelloJNI 类中的printHello()本地方法,
 *用于在控制台输出" Hello World ! "。
 * ***/
JNIEXPORT void JNICALL Java_HelloJni_printHello
(JNIEnv * env, jobject obj) {
	printf("Hello World!\n");
	return;
};

/****
 *Java_HelloJN1_printString()函数接收printString()本地方法传递过来的字符串参
 *数,并输出到控制台上。printString()本地方法传递过来的字符串保存在
 *Java_HelloJNI_printString()函数的第三个参数string (参数类型为jstring) 中。
 *如前所述, jstring 是Java 本地类型,它对应于Java 中的String 类型, 在内存中
 *占用16 位。而C 语言中的字符串仅占用8 位,在C 语言中无法直接使用jstring
 *类型的字符串, 因此需要将jstring 类型的字符串转换成C 语言字符串。
 *GetStringUTFChars()是JNI 函数,用来将Java 字符串转换成C 语言字符串。使
 *用此函数转换字符串之后,再使用printf()函数输出, 即可将本地方法传递过来
 *的字符串输出到控制台上。
 *
 *
 * ****/
JNIEXPORT void JNICALL Java_HelloJni_printString
(JNIEnv * env, jobject obj, jstring jstring) {
	//将java String 转化为C字符串
	const char *str=(*env)->GetStringUTFChars(env,jstring,0);
	printf("%s!\n",str);
	return;
};
5.生成c共享库。hellojni.dll
使用命令:
gcc -Wall -D_JNI_IMPLEMENTATION_ -Wl,--kill-at -Id:/java/include -Id:/java/include/win32 -shared hellojni.c -o hellojni.dll

其中,d:/java/include,和d:/java/include/win32分别表示安装的jdk中的jni.h和jni_md.h等文件。最终生成hellojni.dll文件。
6.运行java程序.
使用命令:java HelloJni



你可能感兴趣的:(Android)