如何用带有gcc的h文件编译一个c文件,用于Java中的JNA? [英] How to compile a c-file with a h-file with gcc for use with JNA in Java?

查看:75
本文介绍了如何用带有gcc的h文件编译一个c文件,用于Java中的JNA?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

你知道如何制作共享对象文件(* .so)吗?

我尝试用gcc编译两个文件(* .c和* .h)(在Linux系统上:Raspbian Wheezy)进入这个特殊的归档文件(* .so),准备用Java加载JNA:



文件 - 下载(文件夹utils的文件,ap和常见复制到文件夹src):

wpa_ctrl.c和wpa_ctrl.h 来自archiv hostapd-2.5.tar。 gz von w1.fi



GCC:

gcc -I./ - o wpa_ctrl.so -shared wpa_ctrl.c wpa_ctrl.h



JAVA:

  import  com.sun.jna.Library; 
import com.sun.jna.Native;
public class LoadLibrary
{
Public interface LoadLibrary extends
{
Public void wpa_ctrl_open();
Public void wpa_ctrl_request;
Public void wpa_ctrl_open( String wpa_ctrl_path);
Public String wpa_ctrl_request( String ping);
}
公共字符串 testLoadLibrary()抛出 IOEexception
{
字符串 libraryPath = 文件( resources / wpa_ctrl / wpa_ctrl.so);
Wpa_ctrl wpa_ctrl =(Wpa_ctrl)Native.loadLirbrary(libraryPath,Wpa_ctrl。 class

String wpa_ctrl_path = / var / run / wpa_supplicant;
wpa_ctrl.wpa_ctrl_open(wpa_ctrl_path):
Strinf answer = wpa_ctrl.wpa_ctrl_request( PING< /跨度>);
return answer;
}
}





问题:我从Java追踪错误(链接错误:未找到任何功能)返回来自gcc的错误:

检查时: objdump -t wpa_ctrl.so

或者: objdump -T wpa_ctrl.so

您将看到,符号表(命令表)不包含来自的功能wpa_ctrl.c wpa_ctrl.h



如何解决我的问题问题?

解决方案

头文件 wpa_ctrl.h 必须指明哪些符号(函数和变量)应该是公共的。这些通过在声明前加上 extern 关键字来表示。没有此关键字的声明不会添加到符号表中。



wpa_ctrl_open的示例:

  extern   void  wpa_ctrl_open( void ); 


Do you know how to make shared object files (*.so)?
I try to compile two files (*.c and *.h) with gcc (on a Linux System: Raspbian Wheezy) into this special archive file (*.so), ready to be loaded in Java with JNA:

Files-Download (files of the folders utils,ap and common copied to folder src):
wpa_ctrl.c und wpa_ctrl.h from the archiv hostapd-2.5.tar.gz von w1.fi

GCC:
gcc -I./ -o wpa_ctrl.so -shared wpa_ctrl.c wpa_ctrl.h

JAVA:

import com.sun.jna.Library;
import com.sun.jna.Native;
public class LoadLibrary
{
	Public interface LoadLibrary extends Library
	{
	Public void wpa_ctrl_open();
	Public void wpa_ctrl_request;
	Public void wpa_ctrl_open(String wpa_ctrl_path);
	Public String wpa_ctrl_request(String ping);
	}
Public String testLoadLibrary() throws IOEexception
	{
	String libraryPath = new File ("resources/wpa_ctrl/wpa_ctrl.so");
	Wpa_ctrl wpa_ctrl = (Wpa_ctrl) Native.loadLirbrary(libraryPath, Wpa_ctrl.class)
	
	String wpa_ctrl_path = "/var/run/wpa_supplicant";
	wpa_ctrl.wpa_ctrl_open(wpa_ctrl_path):
	Strinf answer = wpa_ctrl.wpa_ctrl_request("PING");
	return answer;
	}
}



Problem: I traced the error from Java (Link Error: no function found) back to an error coming from gcc:
When checking with: objdump -t wpa_ctrl.so
or with: objdump -T wpa_ctrl.so
you will see, that the symbol-table (command-table) contains no funtions from wpa_ctrl.c or wpa_ctrl.h.

What to do to resolve my problem?

解决方案

The header file wpa_ctrl.h must indicate which symbols (functions and variables) should be public. These are indicated by prefixing the declarations with the extern keyword. Declarations without this keyword are not added to the symbol table.

Example for wpa_ctrl_open:

extern void wpa_ctrl_open(void);


这篇关于如何用带有gcc的h文件编译一个c文件,用于Java中的JNA?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆