java调c

本文详细介绍了如何在Java中通过JNI调用C代码,包括Java接口类的编写、JNI头文件生成、C源文件实现、动态链接库编译以及Linux平台的兼容性问题。在Linux环境下,由于class文件的差异,需注意Eclipse和javac编译的区别,确保javah的使用和库文件的正确加载。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在文章最后说明了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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值