• 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

  • 相关阅读:
    Android(java)学习笔记204:JNI之native方法头文件的生成
    Linux学习笔记01:Linux下的drwxr-xr-x
    Java基础知识强化49:10个实用的但偏执的Java编程技术
    大数据笔记12:Hadoop安装之安装JDK
    大数据笔记11:MapReduce的运行流程
    大数据笔记10:大数据之Hadoop的MapReduce的原理
    大数据笔记09:大数据之Hadoop的HDFS使用
    大数据笔记08:云计算(云)
    Java基础知识强化48:Java中哈希码
    hdu 1397 (素数判定)
  • 原文地址:https://www.cnblogs.com/dragon16/p/9990242.html
Copyright © 2020-2023  润新知