在Linux环境下编写Java程序调用C函数实现流程

首先确保自己的Linux系统有没有对应的Java环境,如果没有要先在Linux上进行java的安装与配置

1.下载JDK

进入 Oracle官网 下载对应的JDK。

这里以jdk-8u231-linux-i586.tar.gz为例

2.创建java目录

在/usr/目录下创建java目录

	sudo mkdir /usr/java
	cd /usr/java

把下载好的jdk-8u231-linux-i586.tar.gz放在目录/usr/java/中。

3.解压JDK
	sudo tar -zxvf jdk-8u231-linux-i586.tar.gz
4.设置环境变量

修改profile文件

	sudo vim /etc/profile

在文件末尾添加如下内容并保存

	set java environment
    JAVA_HOME=/usr/java/jdk1.8.0_231
    JRE_HOME=/usr/java/jdk1.8.0_231/jre
    CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
    PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
    export JAVA_HOME JRE_HOME CLASS_PATH PATH

刷新环境变量

	source /etc/profile
5.测试是否安装成功
	java -version

显示 java 版本信息,则说明 JDK 安装成功

java version "1.8.0_231"
Java(TM) SE Runtime Environment (build 1.8.0_231-b11)
Java HotSpot(TM) Client VM (build 25.231-b11, mixed mode)

接下来实现一个通过JNI(Java Native Interface)的Native方法 实现java调用C代码的例子

1.实现java代码。文件名: test.java
public class test
{
	static
	{
		System.load("/home/farsight/java_code/jni_native/native.so"); 	
	}

	public static void main(String[] args) 
	{

		NativeMethodTest nmt = new NativeMethodTest();

		int 		nt 		= nmt.intMethod(68);
		boolean 	bool 	= nmt.booleanMethod(true);
		String 		txt 	= nmt.stringMethod("java");
		int 		sum 	= nmt.intArrayMethod(new int[] {1, 2, 3, 4, 5, 6, 9, 15});

		System.out.println("intMethod:" 		+ nt);
		System.out.println("booleanMethod:" 	+ bool);
		System.out.println("stringMethod:" 		+ txt);
		System.out.println("intArrayMethod:" 	+ sum);
	}
}

class NativeMethodTest
{
	public native int 		intMethod(int n);
	public native boolean 	booleanMethod(boolean bool);
	public native String 	stringMethod(String str);
	public native int 		intArrayMethod(int[] arr);
}

2.编译java代码

javac test

生成NativeMethodTest.class和test.class

3.编译生成头文件

javah -jni NativeMethodTest

修改NativeMethodTest.h中的 include <jni.h>为

#include "/usr/java/jdk1.8.0_231/include/jni.h"

最终NativeMethodTest.h 内容如下

/* DO NOT EDIT THIS FILE - it is machine generated */
#include "/usr/java/jdk1.8.0_231/include/jni.h"
/* Header for class NativeMethodTest */

#ifndef _Included_NativeMethodTest
#define _Included_NativeMethodTest
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     NativeMethodTest
 * Method:    intMethod
 * Signature: (I)I
 */
JNIEXPORT jint JNICALL Java_NativeMethodTest_intMethod
  (JNIEnv *, jobject, jint);

/*
 * Class:     NativeMethodTest
 * Method:    booleanMethod
 * Signature: (Z)Z
 */
JNIEXPORT jboolean JNICALL Java_NativeMethodTest_booleanMethod
  (JNIEnv *, jobject, jboolean);

/*
 * Class:     NativeMethodTest
 * Method:    stringMethod
 * Signature: (Ljava/lang/String;)Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_NativeMethodTest_stringMethod
  (JNIEnv *, jobject, jstring);

/*
 * Class:     NativeMethodTest
 * Method:    intArrayMethod
 * Signature: ([I)I
 */
JNIEXPORT jint JNICALL Java_NativeMethodTest_intArrayMethod
  (JNIEnv *, jobject, jintArray);

#ifdef __cplusplus
}
#endif
#endif
4.编写头文件对应的c代码

添加新文件NativeMethodTest.c 内容如下:

#include "NativeMethodTest.h"
#include <string.h>

JNIEXPORT jint JNICALL Java_NativeMethodTest_intMethod
  	(JNIEnv *env, jobject obj, jint i)
{
	return i * i;
}

JNIEXPORT jboolean JNICALL Java_NativeMethodTest_booleanMethod
  	(JNIEnv *env, jobject obj, jboolean b)
{
	return !b;
}


JNIEXPORT jstring JNICALL Java_NativeMethodTest_stringMethod
  	(JNIEnv *env, jobject obj, jstring string)
{
	const char* str = (*env)->GetStringUTFChars(env, string, 0);
	char cap[128] = {0};
	strcpy(cap, str);
	(*env)->ReleaseStringUTFChars(env, string, 0);
	return (*env)->NewStringUTF(env, cap);
}

JNIEXPORT jint JNICALL Java_NativeMethodTest_intArrayMethod
 	 (JNIEnv *env, jobject obj, jintArray array)
{
	int i, sum = 0;
	jsize len = (*env)->GetArrayLength(env, array);
	jint *body = (*env)->GetIntArrayElements(env, array, 0);

	for(i = 0; i < len; i++)
	{
		sum += body[i];
	}
	(*env)->ReleaseIntArrayElements(env, array, body, 0);
	return sum;
}
5.编译c代码生成动态库

gcc NativeMethodTest.c -fpic -shared -o native.so

6.运行java程序

java test

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值