zoukankan      html  css  js  c++  java
  • java调用C程序

    案例
    如下:
    package com.laction.so
    linux:/mnt/zddom/com/laction/so
    -rw-r--r--. 1 root root 922 Nov 13 14:30 HelloJNI.class
    -rw-r--r--. 1 root root 463 Nov 13 14:29 HelloJNI.java

    HelloJNI.java
    package com.laction.so;

    public class HelloJNI {

    public native void printHello();

    public native void printString(String str);

    public native String printStringRetrun(String str);

    static {
    System.loadLibrary("HelloJNI");
    }

    public static void main(String args[]) {
    HelloJNI myJNI = new HelloJNI();

    myJNI.printHello();
    myJNI.printString("Hello World from printString fun");
    System.out.println("java:" + myJNI.printStringRetrun("test"));
    }
    }

    //操作要放在mnt/zddom中
    javac com/laction/so/HelloJNI.java
    会在同一个目录中生成class文件

    接下来生成.h文件
    com_laction_so_HelloJNI.h

    /* DO NOT EDIT THIS FILE - it is machine generated */
    #include <jni.h>
    /* Header for class com_laction_so_HelloJNI */

    #ifndef _Included_com_laction_so_HelloJNI
    #define _Included_com_laction_so_HelloJNI
    #ifdef __cplusplus
    extern "C" {
    #endif
    /*
    * Class: com_laction_so_HelloJNI
    * Method: printHello
    * Signature: ()V
    */
    JNIEXPORT void JNICALL Java_com_laction_so_HelloJNI_printHello
    (JNIEnv *, jobject);

    /*
    * Class: com_laction_so_HelloJNI
    * Method: printString
    * Signature: (Ljava/lang/String;)V
    */
    JNIEXPORT void JNICALL Java_com_laction_so_HelloJNI_printString
    (JNIEnv *, jobject, jstring);

    /*
    * Class: com_laction_ljw_so_HelloJNI
    * Method: printStringRetrun
    * Signature: (Ljava/lang/String;)Ljava/lang/String;
    */
    JNIEXPORT jstring JNICALL Java_com_laction_so_HelloJNI_printStringRetrun
    (JNIEnv *, jobject, jstring);

    #ifdef __cplusplus
    }
    #endif
    #endif

    上面生成的文件需要简单的改动一下,如下:类型加参数

    JNIEXPORT void JNICALL Java_com_laction_so_HelloJNI_printHello
    (JNIEnv * env, jobject o);


    完整文件参数例子


    com_laction_so_HelloJNI.c

    /* DO NOT EDIT THIS FILE - it is machine generated */
    #include "com_laction_so_HelloJNI.h"

    #include <stdio.h>

    /* Header for class com_laction_so_HelloJNI */


    /*
    * Class: com_laction_so_HelloJNI
    * Method: printHello
    * Signature: ()V
    */
    JNIEXPORT void JNICALL Java_com_laction_so_HelloJNI_printHello(JNIEnv * env, jobject o)
    {
    return ;
    }

    /*
    * Class: com_laction_so_HelloJNI
    * Method: printString
    * Signature: (Ljava/lang/String;)V
    */
    JNIEXPORT void JNICALL Java_com_laction_so_HelloJNI_printString(JNIEnv * env, jobject o, jstring s)
    {

    const char *str = (*env)->GetStringUTFChars(env,s,0);
    //printf("%s! ", str);

    return;
    }


    /*
    * Class: com_laction_so_HelloJNI
    * Method: printStringRetrun
    * Signature: (Ljava/lang/String;)Ljava/lang/String;
    */
    JNIEXPORT jstring JNICALL Java_com_laction_so_HelloJNI_printStringRetrun(JNIEnv * env, jobject o, jstring s)
    {
    return s;
    }

    //操作要放在mnt/zddom中
    gcc -fPIC -I $JAVA_HOME/include -I $JAVA_HOME/include/linux -shared -o HelloJNI.so com_laction_ljw_so_HelloJNI.c

    HelloJNI.so

    如果顺利生成so文件,则ok
    如果不能,则检查路径和java.library.path




    如何找java.library.path

    /************如何找java.library.path***************/

    public class HelloWorld{  
      
    public static void main(String args[]){  
      
    System.out.println("Hello! World");  
    System.out.println(System.getProperty("java.library.path"));  
      
    }  
      


    /************自定义一个文件夹***************/
    常见问题:no HelloNative in java.library.path
    如:
    /mnt/so

    修改/etc/profile

    vim /etc/profile
    /////
    export JAVA_HOME=/usr/local/java/jdk1.8.0_171
    export MAVEN_HOME=/usr/local/maven/maven3
    export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
    export PATH=$PATH:$JAVA_HOME/bin:$MAVEN_HOME/bin
    加入
    LD_LIBRARY_PATH=/mnt/so
    export LD_LIBRARY_PATH

  • 相关阅读:
    hibernate动态切换数据源
    spring mvc之@ModelAttribute注解
    Nhibernate 4.0 教程入门
    关于Ubuntu运行级别、开机启动脚本的说明
    开发工程师面试的秘密( 整理自 Export C Programming )
    Linux (Ubuntu12.04) 下开发工具安装和使用
    Java 7 中的Switch 谈 Java版本更新和反编译知识
    Java语言的个人理解
    Jetty 服务器的知识
    集训培训日记——第二天
  • 原文地址:https://www.cnblogs.com/dragon16/p/9990242.html
Copyright © 2011-2022 走看看