以com.company.JniLib.java文件为例
package com.company;
public class JniLib {
public native void setFlagStr(String str);
public native String getFlagStr();
}
第一步,生成头文件,必须要把这个java文件放到com/company的目录下,然后再在根目录下编译
javah -classpath . com.company.JniLib.java
第二步,编写com_company_JniLib.c文件
#include<stdio.h>
#include<jni.h>
#include "com_company_JniLib.h"
const char * str;
JNIEXPORT void JNICALL Java_com_company_JniLib_setFlagStr(JNIEnv * env, jobject j, jstring s)
{
str = (*env)->GetStringUTFChars(env, s, 0);;
}
JNIEXPORT jstring JNICALL Java_com_company_JniLib_getFlagStr(JNIEnv * env, jobject j)
{
return (*env)->NewStringUTF(env, str);
}
第三步,编译生成so文件
gcc -fPIC -I /usr/java/include -I /usr/java/include/linux -c com_company_JniLib.c
gcc -shared com_company_JniLib.o -o jnilib.so
第四步,程序中调用so文件
public class Main {
static {
System.load("/root/jni/jnilib.so");
}
public static void main(String[] args) {
JniLib lib = new JniLib();
lib.setFlagStr("值1000大洋的“hello world”!");
System.out.println(lib.getFlagStr());
}
}
程序需要在linux下才能运行,打包成jar,执行效果如下: