Java笔记-Java通过JNI调用Linux上so文件

目录

 

基本概念

代码与实例


 

基本概念

流程就是下面这个图:

Java笔记-Java通过JNI调用Linux上so文件_第1张图片

 

 

 

 

代码与实例

这里以Linux上的so文件为例。

创建好HelloWorld.java后,通过:

javac HelloWorld.java

编译为class文件。

再通过:

javah -jni HelloWorld

让其生成本地方法头文件HelloWorld.h。

自己再创建一个HelloWorld.cpp,把HelloWorld.h中的函数定义一下;

具体文件如下:

具体内容如下:

HelloWorld.java

class HelloWorld{

        private native void print();

        public static void main(String[] args){

                new HelloWorld().print();
        }

        static{

                System.loadLibrary("HelloWorld");
        }
}

HelloWorld.h

/* DO NOT EDIT THIS FILE - it is machine generated */
#include 
/* Header for class HelloWorld */

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

#ifdef __cplusplus
}
#endif
#endif

HellWorld.c

#include 
#include 
#include "HelloWorld.h"

JNIEXPORT void JNICALL Java_HelloWorld_print(JNIEnv *env, jobject obj){

        printf("Hello world, hehehe!\n");
}

随后把CPP文件编译为so文件:

gcc -I/usr/lib/jvm/java-7-openjdk-amd64/include -I/usr/lib/jvm/java-7-openjdk-amd64/include/solaris -fPIC -shared -o libHelloWorld.so HelloWorld.c

截图如下:

Java笔记-Java通过JNI调用Linux上so文件_第2张图片

-f后面跟一些编译选项,PIC是其中一种,表示生成位置无关代码(Position Independent Code)
 

跑一下看看能不能成功:

你可能感兴趣的:(C/C++,C/C++&JAVA,Java)