将Makefile转换为Android.mk

时间:2015-03-19 15:54:13

标签: android c++ makefile java-native-interface native

我有一个带有JNI接口和makefile的给定c ++项目,它创建了一个可以从Java应用程序成功调用的共享库。 通过在Ubuntu中使用纯Java,一切正常。

现在我想从Android应用程序执行JNI调用,所以我必须为Android构建c ++共享库,这是我的问题,因为我不太熟悉C ++和makefile。

我的第一步是构建一个简单的c ++测试项目,只需要2个类,并使用标准算术运算来熟悉该过程。一切都很好,我可以从我的Android应用程序执行本机操作。

现在我的当前步骤是从给定的c ++项目构建一个共享库,该库可以由makefile构建,但不能通过Android.mk构建

makefile如下所示:

JAVA_HOME=/usr/lib/jvm/java-7-openjdk-i386
MY_INCLUDES=./
CC=g++
ARCH = $(shell uname -m)
CFLAGS=-c -fPIC -D$(ARCH) -DOS_LINUX -Wall

all: libSteering

clean:
  rm obj/*.o libSteering.so

# the shared library
libSteering: Steering.o customizestub-JNI.o objs.o linwin.o qflite.o csocketclass.o ioclass.o ioportclass.o
  $(CC) obj/Steering.o obj/customizestub-JNI.o obj/objs.o obj/linwin.o obj/qflite.o obj/csocketclass.o \
obj/ioclass.o obj/ioportclass.o -shared -lrt -o libSteering.so

# The JNI file needs Java includes as well
Steering.o: Steering.cpp Steering.h
  $(CC) $(CFLAGS) Steering.cpp -I$(JAVA_HOME)/include -I$(JAVA_HOME)/include/linux -I$(MY_INCLUDES) -o obj/Steering.o

# the rest of the CAPI source files
customizestub-JNI.o: customizestub-JNI.cpp
  $(CC) $(CFLAGS) customizestub-JNI.cpp -I$(MY_INCLUDES) -o obj/customizestub-JNI.o
objs.o: shared/sw/api/src/objs.cpp
  $(CC) $(CFLAGS) shared/sw/api/src/objs.cpp -I$(MY_INCLUDES) -o obj/objs.o
# special hack for Linwin, so it doesn't call clokc_gettime()
linwin.o: shared/sw/src/linwin.cpp 
  $(CC) $(CFLAGS) -DELDK -I$(MY_INCLUDES) shared/sw/src/linwin.cpp -o obj/linwin.o
qflite.o: shared/sw/src/qflite.cpp
  $(CC) $(CFLAGS) -I$(MY_INCLUDES) shared/sw/src/qflite.cpp -o obj/qflite.o
csocketclass.o: shared/sw/io/src/csocketclass.cpp
  $(CC) $(CFLAGS) -I$(MY_INCLUDES) shared/sw/io/src/csocketclass.cpp -o obj/csocketclass.o
ioclass.o: shared/sw/io/src/ioclass.cpp
  $(CC) $(CFLAGS) -I$(MY_INCLUDES) shared/sw/io/src/ioclass.cpp -o obj/ioclass.o
ioportclass.o: shared/sw/io/src/ioportclass.cpp
  $(CC) $(CFLAGS) -I$(MY_INCLUDES) shared/sw/io/src/ioportclass.cpp -o obj/ioportclass.o

我创建了以下Android.mk

LOCAL_PATH := $(call my-dir)
    include $(CLEAR_VARS)
    LOCAL_SRC_FILES := Steering.cpp customizestub-JNI.cpp shared/sw/api/src/objs.cpp shared/sw/src/linwin.cpp shared/sw/src/qflite.cpp shared/sw/io/src/csocketclass.cpp shared/sw/io/src/ioclass.cpp shared/sw/io/src/ioportclass.cpp
    LOCAL_MODULE := Steering
    include $(BUILD_SHARED_LIBRARY)

我直接得到了一些编译错误,告诉我没有定义成员变量和getter方法。所以我认为我的包含有一些问题。 也许任何人都可以帮助我们。

非常感谢

1 个答案:

答案 0 :(得分:0)

您可以使用LOCAL_C_INCLUDES添加包含路径,例如:

LOCAL_C_INCLUDES += $(JAVA_HOME)/include
LOCAL_C_INCLUDES += $(JAVA_HOME)/include/linux