首先确保自己的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