好记性不如铅笔头

C && C++, java, 编程

Linux下使用JNI的最简单实现

Java和C之间的调用可以使用JNI来实现,这里笔记下一种最简单的实现流程。

CONTENTS

本地的C文件:

functions.h:

#ifndef FUNCTIONS_H_
#define FUNCTIONS_H_

int add(int a, int b);

#endif /* FUNCTIONS_H_ */

functions.c:

#include "functions.h"

int add(int a, int b)
{
	return a+b;
}

Jni文件:

JniSwapper.java:

备注:

1 作者好久没有搞java了,代码都忘了怎么写了,勿拍砖~~

2 为了简单起见,这里调用动态库时采用绝对路径。

public  final  class JniSwapper 
{
	private JniSwapper() 
	{
		super();
	}
	 static 
	 { 
		 try 
		 {  
			 System.load("/home/cstriker1407/workspace/HelloJni/src/libJniSwapper.so");		 
		 } 
		 catch(UnsatisfiedLinkError e) 
		 { 
			 System.err.println( "Cannot load library:\n " +  e.toString() ); 
		 } 
	 } 
	public static final native int jni_add(int x, int y);
}

根据JniSwapper.java生成JniSwapper.h文件,命令如下:

cstriker1407@cstriker1407-x64:~/workspace/HelloJni/src$ javac JniSwapper.java 
cstriker1407@cstriker1407-x64:~/workspace/HelloJni/src$  javah JniSwapper

JniSwapper.h:

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

#ifndef _Included_JniSwapper
#define _Included_JniSwapper
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     JniSwapper
 * Method:    jni_add
 * Signature: (II)I
 */
JNIEXPORT jint JNICALL Java_JniSwapper_jni_1add
  (JNIEnv *, jclass, jint, jint);

#ifdef __cplusplus
}
#endif
#endif

根据JniSwapper.h文件我们可以编写JniSwapper.c文件。

JniSwapper.c:

#include "JniSwapper.h"
#include "functions.h"

JNIEXPORT jint JNICALL Java_JniSwapper_jni_1add(JNIEnv *env, jclass cls, jint x, jint y)
{
	return add(x, y);
}

生成so:

文件都搞定之后,我们可以生成so,命令如下:

gcc functions.c JniSwapper.c -fPIC -shared -I/usr/lib/jvm/java-7-openjdk-amd64/include -o libJniSwapper.so

测试文件:

HelloJni.java:

public class HelloJni 
{
	public static void main(String[] args) 
	{
		System.out.println( "100 + 200 = " + JniSwapper.jni_add(100, 200) );
	}
}

执行:

命令行下执行:

cstriker1407@cstriker1407-x64:~/workspace/HelloJni/src$ javac HelloJni.java 
cstriker1407@cstriker1407-x64:~/workspace/HelloJni/src$ ls
functions.c  HelloJni.class  JniSwapper.c      JniSwapper.h     libJniSwapper.so
functions.h  HelloJni.java   JniSwapper.class  JniSwapper.java
cstriker1407@cstriker1407-x64:~/workspace/HelloJni/src$ java HelloJni 
100 + 200 = 300

发表评论

2 × 5 =

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据