在文章最后说明了eclipse生成的class文件和linux平台下class文件不一致。
1. Java –version
实验环境是java version "1.8.0_121",jdk版本不一样,jni.h的定义不一样,接口不一样,可能会不兼容,因此尽量include文件拷走
2. Echo $JAVA_HOME echo$PATH
3. 写一个java与c的接口类,文件名为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