Linux下生成so,使用JNI调用C/C++程序

以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
#include
#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,执行效果如下:



你可能感兴趣的:(Java)