Linux 环境Java 调用C

请先配置Java环境...

1.创建Java文件Hello.java

public class Hello{
	public native void HelloWorld();
	static{
		System.loadLibrary("hello");
	}
	
	public static void main(String[] args){
	
		new Hello().HelloWorld();
	}
}

2.编辑Java

javac Hello.java

3.生成java头文件

javah -jni Hello
[root@BigData116 tools]# ls
Hello.class  Hello.h  Hello.java

多了一个.h 文件

4. more Hello.h

[root@BigData116 tools]# more Hello.h 
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class Hello */

#ifndef _Included_Hello
#define _Included_Hello
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     Hello
 * Method:    HelloWorld
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_Hello_HelloWorld
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

5.编辑c文件

[root@BigData116 tools]# touch Hello.c
[root@BigData116 tools]# vi Hello.c
#include <stdio.h>
#include <stdlib.h>
#include "jni.h"
#include "Hello.h"

JNIEXPORT void JNICALL JNICALL Java_Hello_HelloWorld (JNIEnv *env, jobject obj)
{
	printf("hello world ,i am from Hello.c");
}

6.-fPIC 选项作用于编译阶段,告诉编译器产生与位置无关代码

gcc -fPIC -I $JAVA_HOME/include -I $JAVA_HOME/include/linux -c Hello.c
[root@BigData116 tools]# ls
Hello.c  Hello.class  Hello.h  Hello.java  Hello.o

多了个.o 文件

7.生成共享库格式.

动态链接文件称为动态共享对象 (Dynamic Shared Objects,DSO),一般是以 .so 为扩展名的文件

[root@BigData116 tools]# gcc -shared Hello.o -o libhello.so

8.运行测试

[root@BigData116 tools]# java Hello
Exception in thread "main" java.lang.UnsatisfiedLinkError: no hello in java.library.path
	at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1867)
	at java.lang.Runtime.loadLibrary0(Runtime.java:870)
	at java.lang.System.loadLibrary(System.java:1122)
	at Hello.<clinit>(Hello.java:4)

设置library 环境 bash_profile

export LD_LIBRARY_PATH=/root/tools

使环境生效

source ~/.bash_profile

运行 java Hello

[root@BigData116 tools]# java Hello
hello world ,i am from Hello.c

 

总的来说,将一个本地方法链接到Java程序中需要经过以下5个步骤:

  1. 在Java类中声明一个本地方法;
  2. 运行javah以获得包含该方法的C声明的头文件;
  3. 用C实现该本地方法;
  4. 将代码置于共享类库中;
  5. 在Java程序中加载该类库。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章