用JNI编译bacnet-stack-0-8-0

问题描述

我需要配置“ bacnet-stack-0-8-0”项目以与JNI一起使用时需要帮助。 提到的项目是一个开源项目,我感兴趣的子项目是/ demo / gateway:

http://svn.code.sf.net/p/bacnet/code/branches/releases/bacnet-stack-0-8-0/

为了进行测试,我向上述项目中添加了HelloJNI.c文件,仅使用该文件创建了该项目(使用makefile),并成功从Java代码调用了sayHello()函数,但是当我尝试添加sayHello时()将JNI函数添加到demo / gateway / main.c,使项目失败,并显示以下错误

/ usr / bin / ld:../../lib/libbacnet.a(bvlc.o):制作共享库时,不能使用符号'bvlc_send_mpdu'的重定位R_X86_64_PC32;用-fPIC
重新编译 / usr / bin / ld:最终链接失败:值错误 collect2:错误:ld返回1退出状态 Makefile:65:目标'libmynativelib.so'的配方失败

demo / gateway / main.c:

#include "jni.h"

#include "HelloJNI.h"
#include ...

//code...

JNIEXPORT void JNICALL Java_HelloJNI_sayHello(jnienv *env,jobject thisObj) {
  printf("Hello World - From my C project!\n");
  return;
}

/** Main function of server demo.
 *
 * @see Device_Set_Object_Instance_Number,dlenv_init,Send_I_Am,*      datalink_receive,npdu_handler,*      dcc_timer_seconds,bvlc_maintenance_timer,*      Load_Control_State_Machine_Handler,handler_cov_task,*      tsm_timer_milliseconds
 *
 * @param argc [in] Arg count.
 * @param argv [in] Takes one argument: the Device Instance #.
 * @return 0 on success.
 */
int main(
    int argc,char *argv[])
{
    BACNET_ADDRESS src = {
        0
    };  /
...

网关makefile:

#Makefile to build BACnet Gateway Demonstration Application for the Linux Port

# tools - only if you need them.
# Most platforms have this already defined
# CC = gcc
#CC = gcc -fPIC -shared -I $(JAVA_HOME)/include -I $(JAVA_HOME)/include/linux -I /home/rami/eclipse-workspace/ForTests/src/tests/ -o /home/rami/eclipse-workspace/ForTests/src/tests/mynativelib.so 

    
# Executable file name
TARGET = bacgateway
#TARGET_EXT=.so

TARGET_SO=libmynativelib.so
LDFLAGS=-shared

INCLUDES_JNI=-I $(JAVA_HOME)/include -I $(JAVA_HOME)/include/linux -I /home/rami/eclipse-workspace/ForTests/src/

TARGET_BIN = ${TARGET}$(TARGET_EXT)

# put any overloaded or special built src files here,# so the linker uses these instead of the functions in the library
SRCS = main.c \
    HelloJNI.c \
    $(BACNET_OBJECT)/gw_device.c \
    $(BACNET_HANDLER)/h_routed_npdu.c \
    $(BACNET_HANDLER)/s_router.c \
    $(BACNET_OBJECT)/device.c \
    $(BACNET_OBJECT)/ai.c \
    $(BACNET_OBJECT)/ao.c \
    $(BACNET_OBJECT)/av.c \
    $(BACNET_OBJECT)/bi.c \
    $(BACNET_OBJECT)/bo.c \
    $(BACNET_OBJECT)/bv.c \
    $(BACNET_OBJECT)/csv.c \
    $(BACNET_OBJECT)/lc.c \
    $(BACNET_OBJECT)/lsp.c \
    $(BACNET_OBJECT)/ms-input.c \
    $(BACNET_OBJECT)/mso.c \
    $(BACNET_OBJECT)/msv.c \
    $(BACNET_OBJECT)/nc.c  \
    $(BACNET_OBJECT)/osv.c \
    $(BACNET_OBJECT)/piv.c \
    $(BACNET_OBJECT)/schedule.c  \
    $(BACNET_OBJECT)/trendlog.c \
    $(BACNET_OBJECT)/bacfile.c 

OBJS = ${SRCS:.c=.o}

DEFInes += -DBAC_ROUTING

CFLAGS  = $(WARNINGS) $(DEBUGGING) $(OPTIMIZATION) $(STANDARDS) $(INCLUDES) $(INCLUDES_JNI) $(DEFInes) -g

#all: ${BACNET_LIB_TARGET} Makefile ${TARGET_BIN}
all: ${BACNET_LIB_TARGET} Makefile ${TARGET_SO}

    
${TARGET_SO}: ${OBJS} Makefile ${BACNET_LIB_TARGET} 
    ${CC} -fPIC ${PFLAGS} ${CFLAGS} ${OBJS} ${LFLAGS} ${LDFLAGS} -o $@
    size $@
    
${TARGET_BIN}: ${OBJS} Makefile ${BACNET_LIB_TARGET} 
    ${CC} ${PFLAGS} ${OBJS} ${LFLAGS} -o $@
    size $@
    cp $@ ../../bin

lib: ${BACNET_LIB_TARGET}

${BACNET_LIB_TARGET}:
    ( cd ${BACNET_LIB_DIR} ; $(MAKE) clean ; $(MAKE) )

.c.o:
    ${CC} -c ${CFLAGS} $*.c -o $@

depend:
    rm -f .depend
    ${CC} -MM ${CFLAGS} *.c >> .depend

clean:
    rm -f core ${TARGET_BIN} ${OBJS} ${BACNET_LIB_TARGET} $(TARGET).map
    #rm -f $(OBJS) $(TARGET_SO)

include: .depend

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...