java调c

来源:互联网 发布:gps航迹编辑软件 编辑:程序博客网 时间:2024/06/11 01:36

在文章最后说明了eclipse生成的class文件和linux平台下class文件不一致。

1.        Java –version

实验环境是java version "1.8.0_121"jdk版本不一样,jni.h的定义不一样,接口不一样,可能会不兼容,因此尽量include文件拷走

2.        Echo $JAVA_HOME echo$PATH

3.        写一个javac的接口类,文件名为JavaToTest.java

publicclass JavaToCSend

 {

         public JavaToCSend()

          { super();}

          static

          {   try

                 {

 //此处即为本地方法所在链接库名

                            System.loadLibrary("dandao");

                    }

                    catch(UnsatisfiedLinkError e)

                    {

                System.err.println( "Cannot load clibrary:\n " +e.toString() );

                    }

          }

         //声明的本地方法,使用c实现的方法

        public native String stringMethod(Stringtext);

         //可在其他类中调用

   public static void main(String[] args)

     {

         JavaToCSend sample = new JavaToCSend();

         String text  = sample.stringMethod("Thinking InJava");

         System.out.println("stringMethod:" + text);

    }

}

4.        Javac JavaToCSend.java

为了生成JavaToCSend,然后用javah生成JavaToCSend.cpp文件所需要的JavaToCSend.h头文件。

1.        / $JAVA_HOME/bin/javah  JavaToCSend或者javah -jni JavaToCSend 

 生成JavaToCSend.h

2.        写一个cpp文件,命名为JavaToCSend.cpp

#include"JavaToCSend.h"

#include<stdio.h>

#include<string.h>

 JNIEXPORT jstring JNICALL Java_JavaToCSend_stringMethod

  (JNIEnv * env, jobject arg, jstring instring)

 {

   //从 instring字符串取得指向字符串UTF编码的指针

   const char* szStr = env->GetStringUTFChars(instring, JNI_FALSE );

  printf( "String = [%s]/n", szStr); 

  env->ReleaseStringUTFChars(instring, szStr); 

  return instring;

 }

5.        gcc -Wall -fPIC -I./include -I./include/linux -shared -olibdandao.so JavaToCSend.cpp

因此每次需要拷走include文件,为了兼容jni等头文件,成功后会生成动态链接库libdandao.so

3.        exportLD_LIBRARY_PATH=.:$LD_LIBRARY_PATH

4.        java -cp . JavaToCSend

 

备注:

工程中遇到问题,eclipse生成的class文件和linux下javac生成的class文件不一样,eclipse下的class不支持javah,因此将所有的jar包,java源文件拷贝至linux平台下,编译。

解决流程如下:

Consumer

建立lib目录,保存jar包文件

javac -cp .:lib/* *.java

javah -jni JavaToCSend 

生成JavaToCSend.h

修改JavaToCSend.cpp

g++ -Wall -fPIC -shared -I./include-I./include/linux -L. -o libdandao.so JavaToCSend.cpp –lsft

成功后会生成动态链接库libdandao.so

export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH

java -cp .:lib/* DataCconsumerconf.properties

java -cp .:lib/* KafkaConsumerMainconsumerconf.properties

 

producer

建立lib目录,保存jar包文件

javac -cp .:lib/* *.java

javah -jni JavaToCRecv 

生成JavaToCRecv.h

修改JavaToCRecv.cpp

g++ -Wall -fPIC -shared -I./include-I./include/linux -L. -o libdandao.so JavaToCRecv.cpp –lsft

成功后会生成动态链接库libdandao.so

export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH

java -cp .:lib/* JavaToCRecv producerconf.properties

 

0 0
原创粉丝点击