zoukankan      html  css  js  c++  java
  • Java在linux下调用C/C++生成的so文件

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

    package cn.undoner.utils;
    
    
    /**
     * Created by ${<A HREF="mailto:undoner@gmail.com">undoner</A>} on 16-2-25.
     */
    public class CplusUtil {
        public native void sayHello();
    
    
        static{
            System.out.println(System.getProperty("java.library.path"));
            System.load("/usr/lib/jvm/java/jre/lib/amd64/server/MyJni.so");
        }
    
    
    
    
        public static void main(String[] args){
            CplusUtil h = new CplusUtil();
            h.sayHello();
        }
    }





    2.
    可通过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
    内容如下:
    /* DO NOT EDIT THIS FILE - it is machine generated */
    #include <jni.h>
    /* Header for class cn_undoner_utils_CplusUtil */
    
    
    #ifndef _Included_cn_undoner_utils_CplusUtil
    #define _Included_cn_undoner_utils_CplusUtil
    #ifdef __cplusplus
    extern "C" {
    #endif
    /*
     * Class:     cn_undoner_utils_CplusUtil
     * Method:    sayHello
     * Signature: ()V
     */
    JNIEXPORT void JNICALL Java_cn_undoner_utils_CplusUtil_sayHello
      (JNIEnv *, jobject);
    
    
    #ifdef __cplusplus
    }
    #endif
    #endif



    4.编写c函数
    文件:MyJni.c
    内容如下:
    #include <jni.h>
    #include "cn_undoner_utils_CplusUtil.h"
    #include <stdio.h>
    
    
    JNIEXPORT void JNICALL Java_cn_undoner_utils_CplusUtil_sayHello(JNIEnv *env,jobject obj){
    
    
        printf("Hello JNI");
        return;
    }



    5.
    将.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


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


    7.
    本文MyJni.so路径为:

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


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


    9.
    结果:
    /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

  • 相关阅读:
    小程序购物车页面样式
    用css让div高度自动撑满屏幕
    客户端封装浏览器
    vuex模块的普通用法
    vue图片预览
    Django中Cookie和Session配置和操作
    jira的插件开发流程实践
    python3.7安装模块MySQLdb报错error: Microsoft Visual C++ 14.0 is required.
    Hadoop2.9下运行JAR包时System.out.println的输出日志
    MapReduce程序——WordCount(Windows_Eclipse + Ubuntu14.04_Hadoop2.9.0)
  • 原文地址:https://www.cnblogs.com/wuyida/p/6300871.html
Copyright © 2011-2022 走看看