美文网首页
linux下调用C/C++生成的so文件

linux下调用C/C++生成的so文件

作者: modingfa | 来源:发表于2019-07-22 21:10 被阅读0次

    Java在linux下调用C/C++生成的so文件

    CplusUtil.java是java web工程中的一个工具类
    内容如下:
    CplusUtil.java

    [java] view plaincopyprint?

    1. package cn.undoner.utils;

    2. /**

      • Created by ${<A HREF="mailto:undoner@gmail.com">undoner</A>} on 16-2-25.
    3. */

    4. public class CplusUtil {

    5. public native void sayHello();

    6. static{

    7. System.out.println(System.getProperty("java.library.path"));

    8. System.load("/usr/lib/jvm/java/jre/lib/amd64/server/MyJni.so");

    9. }

    10. public static void main(String[] args){

    11. CplusUtil h = new CplusUtil();

    12. h.sayHello();

    13. }

    14. }

    可通过IDE工具(Eclipse/IntellJ/javac等)编译整个工程,生成相应class文件
    本文路经为:
    /工程名/target/classes/cn/undoner/utils/CplusUtil.class

    3.为utils所需调用的c函数生成相应.h头文件
    注意:在有包名情况下,生成.h头文件要记得带上包名路径
    javah -classpath classes -jni cn.undoner.utils.CplusUtil

    生成文件:cn_undoner_utils_CplusUtil.h
    内容如下:

    [cpp] view plaincopyprint?

    1. /* DO NOT EDIT THIS FILE - it is machine generated */

    2. include <jni.h>

    3. /* Header for class cn_undoner_utils_CplusUtil */

    4. ifndef _Included_cn_undoner_utils_CplusUtil

    5. define _Included_cn_undoner_utils_CplusUtil

    6. ifdef __cplusplus

    7. extern "C" {

    8. endif

    9. /*

      • Class: cn_undoner_utils_CplusUtil
      • Method: sayHello
      • Signature: ()V
    10. */

    11. JNIEXPORT void JNICALL Java_cn_undoner_utils_CplusUtil_sayHello

    12. (JNIEnv *, jobject);

    13. ifdef __cplusplus

    14. }

    15. endif

    16. endif

    4.编写c函数
    文件:MyJni.c
    内容如下:

    [cpp] view plaincopyprint?

    1. include <jni.h>

    2. include "cn_undoner_utils_CplusUtil.h"

    3. include <stdio.h>

    4. JNIEXPORT void JNICALL Java_cn_undoner_utils_CplusUtil_sayHello(JNIEnv *env,jobject obj){

    5. printf("Hello JNI");

    6. return;

    7. }

    将.c文件编译成.o,再重新转换成.so或者.dll文件
    gcc -fPIC -D_REENTRANT -I /usr/lib/jvm/java/include -I /usr/lib/jvm/java/include/linux -c MyJni.c
    生成文件:MyJni.o

    将.o文件编译成.so文件
    gcc -shared MyJni.o -o MyJni.so
    生成文件:MyJni.so

    本文MyJni.so路径为:

    /usr/lib/jvm/java/jre/lib/amd64/server/MyJni.so

    执行CplusUtil.class
    在ide中运行CplusUtil或者直接java命令执行:
    java cn.undoner.utils.CplusUtil

    结果:
    /usr/lib/jvm/java/jre/lib/amd64/server:/usr/lib/jvm/java/jre/lib/amd64:/usr/lib/jvm/java/jre/../lib/amd64:/home/vobile/java_tool/idea-IU-141.178.9/bin::/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib
    Hello JNI

    注:System.getProperty("java.library.path")输出以下信息为本机的lib路径:
    /usr/lib/jvm/java/jre/lib/amd64/server:/usr/lib/jvm/java/jre/lib/amd64:/usr/lib/jvm/java/jre/../lib/amd64:/home/vobile/java_tool/idea-IU-141.178.9/bin::/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib

    相关文章

      网友评论

          本文标题:linux下调用C/C++生成的so文件

          本文链接:https://www.haomeiwen.com/subject/yayglctx.html