买的Xilinx官方的板子的user application的源代码是用java写,为了测试batching,需要修改源代码。
发现驱动层的调用是使用JNI。
没办法就得看JNI部分的代码,正好java代码是用eclipse看的,那就直接搞了个CDT一起开发JNI。
本文记录eclipse+CDT+JNI的配置开发流程。
由于driver调用是基于POSIX系统,本文开发环境是Centos 7.2
eclipse: Neon
首先安装CDT插件
help -> install new softwares
输入CDT,然后下载,安装。
JNI java project
现在开始JNI编程,首先建立一个就java project,名字为
JNI_Test,创建一个名为com.example.jni的package,
然后在该包中创建一个JNITest的class,内容如下:1
2
3
4
5
6
7
8
9
10
11
12package com.example.jni;
public class JNITest {
static {
// 调用文件名为JNI Library.dll的动态库
System.loadLibrary("libJNI Library");
}
public static void main(final String[] args) {
new JNITest().hello("world");
}
// native方法声明
public native void hello(String name);
}然后就是要生成.h的头文件,这里提供两种方法。
1:javah命令。
进入JNI Test项目目录,然后进入其bin目录。执行如下命令:javah com.example.jni.JNITest
则会在bin目录下生成对应的C++ .h头文件com_example_jni_JNITest.h
其内容如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21/* DO NOT EDIT THIS FILE - it is machine generated */
/* Header for class com_example_jni_JNITest */
extern "C" {
/*
* Class: com_example_jni_JNITest
* Method: hello
* Signature: (Ljava/lang/String;)V
*/
JNIEXPORT void JNICALL Java_com_example_jni_JNITest_hello
(JNIEnv *, jobject, jstring);
}2:用eclipse来实现
在external configuration tools中Program选项下新建一个Program,命名为javah,具体配置如下图:
Location:填入系统jdk安装目录的bin/javah
然后在第一步写的JNITest.java文件上运行该javah配置,
运行成功后,刷新该项目,会发现多出一个jni文件夹,里面有我们需要的头文件com_example_jni_JNITest.h新建一个C++ project,名字为
JNI_Library注意:项目类型要选择shared library
将上一步生成的com_example_jni_JNITest.h复制到该项目下面,并新建一个cpp文件,
cpp文件的内容如下:1
2
3
4
5
6
7
8
9
10
using namespace std;
JNIEXPORT void JNICALL Java_com_example_jni_JNITest_hello(JNIEnv *env, jobject jthis, jstring data) {
jboolean iscopy;
const char *charData = env->GetStringUTFChars(data, &iscopy);
cout << "Hello " << charData << endl;
env->ReleaseStringUTFChars(data, charData);
}注意:会提示找不到jni.h头文件,这时候需要添加JDK的javah的include目录。
在JNI_Library项目,右键->properties-> C/C++ General -> Paths and Symbols
此时在
JNI_Library项目,右键->build project
会提示错误”relocation R_X86_64_32 against.rodata' can not be used when making a shared object; recompile with -fPIC" 需要在编译的时候加上-fPIC`,
对于使用makefile的朋友来说完全不是问题,只需在每个编译选项上加上-fPIC即可,
但是不知道在eclipse什么地方加这一选项,查了半天资料,终于找到了,
右键->properties->c/c++Build->Setting->Toolsetting->gcc c++compiler->optimization->otheroptimization flags,加上-fPIC即可。
最后build project就可以得到.so文件。
在
JNI_Testjava项目给下新建一个lib文件夹,将JNI_Libraryc++项目的Debug目录中生成的libJNI_Library.so复制进lib目录。然后右键JNI_Test->properties
注意:lib文件夹中的.so文件,名字前面需要有lib,如:
libJNI_Library.so
对应的java代码中为System.loadLibrary("JNI_Library");不要lib和后面的.so
直接run as java application.