Android JNI(二)————JNI_在java中调用C库函数(隐式建立)

第一步:编写、编译java代码

class HelloJNI {
	/*1、本地方法声明
	 *   本地方法和本地函数:jni实现,方法在java代码中声明的,而具体实现实在C/C++代码中。在
	 *一般的JNI书籍中,将这两种情况下的方法都成为本地方法,容易混淆。故将尽在java代码中声明
	 *的方法称为本地方法,使用C/C++实现的函数称为本地函数
	 *   在java类中,使用“native”关键字,声明本地方法,该方法与用C/C++编写的JNI本地函数相
	 *对应。“native”关键字告诉java编译器,在java代码中带有该关键字的方法只是申明,实
	      *现在C/C++等其他语言中。
	 */
	native void printHello();
	native void printString(String str);

	/*2、加载库
	 *    加载具体实现本地方法的C运行库。在java中加载本地运行库是通常使用“静态块”,使C运行
      	 *库在调用本地方法之前加载进来。
	 **/
	static {
		System.loadLibrary("hellojni");
	}
	
	/*3、本地方法和本地函数映射,在后面完成了*/
	public static void main(String args[]) {
		HelloJNI myJNI = new HelloJNI();
		/*4、调用本地方法*/
		myJNI.printHello();
		myJNI.printString("Hello World from printString fun");
	}
}
 
 

编译 javac HelloJNI.java


第二步:生成C语言头文件

运行时,Java虚拟机会在加载的本地运行库中查找与java本地方法相匹配的C函数,并生成映射表,

而后将java本地方法与C函数连接在一起的。如何链接,使用函数原型。当生成了函数原型,java虚拟机

即可把本地库中相应的函数与java本地方法映射在一起。

	/*1、生成函数原型HelloJNI.h(头文件)*/
	javah HelloJNI
	
/* 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);   /*JNIEnv是JNI接口的指针,后面介绍。jobject为JNI提供的java本地类型
			  *保存着调用本地方法对象的一个引用。
			  *若本地方法为静态方法时(static),第二个参数为jclass。
			  */

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


HelloJNI.h里面的内容自己看。

第三步:编写C/C++代码

#include "HelloJNI.h"
#include <stdio.h>
/*
 * Class:     HelloJNI
 * Method:    printHello
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_HelloJNI_printHello(JNIEnv *env, jobject obj)
{
	printf("Hello World!\n");
	return;
}

/*
 * Class:     HelloJNI
 * Method:    printString
 * Signature: (Ljava/lang/String;)V
 */
JNIEXPORT void JNICALL Java_HelloJNI_printString(JNIEnv *env, jobject obj, jstring string)
{
	/*注意:jstring是java本地类型,它对应于java中的String类型,在内存中占用16位。而在C语言中
	 *字符串仅占用8位,在C语言中无法直接使用jstring类型的字符串,因此需要将jstring类型的字符
	 *串转换成C语言字符串。
	 */
	const char *str = (*env)->GetStringUTFChars(env,string,0);
	printf("%s!\n",str);
	return;
}

四步:生成C共享库

gcc -shared -fPIC hellojni.c -o libhellojni.so -I/usr/lib/jvm/java-1.7.0-openjdk-amd64/include/

第五步:指定链接地址

export LD_LIBRARY_PATH=.

第六步:运行java程序

#java HelloJNI
 
Hello World!
Hello World from printString fun!




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值