Android makefile包含动态库运行时错误

时间:2013-08-07 15:34:32

标签: java android makefile java-native-interface

我正在尝试使用jni编写一些Android应用程序。

我有一个Activity文件,它实例化另一个调用jni函数的类。

我的cpp代码构建正常并放在 libs / armeabi / libAppList.so

的位置

我的java文件是这样的。

package com.example.applist;

public class Backend {
    static {

        try {
            System.loadLibrary("AppList");
        } catch(Exception e) {
            Log.d("Backend","caught exception" + e);
        }

    }        

    public native int createGroup() ;
}

我的makefile如下所示

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)

LOCAL_MODULE_TAGS := optional

#Only compile source java files in this apk.

LOCAL_SRC_FILES := $(call all-java-files-under, src)

LOCAL_PACKAGE_NAME := AppList

LOCAL_CERTIFICATE := platform

include $(BUILD_PACKAGE)
LOCAL_PREBUILT_LIBS := libs/armeabi/libAppList.so
include $(BUILD_MULTI_PREBUILT)

我只是从我的主活动类中实例化这个类进行测试。 (new Backend();) 但是我收到运行时错误。有人可以解释我做错了什么吗?我只是一个新的学习者。

#编辑: 我想出了如何编写正确的makefile。 这是:

LOCAL_PATH:= $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
# Only compile source java files in this apk.
LOCAL_SRC_FILES := $(call all-java-files-under, src)
LOCAL_REQUIRED_MODULES := libAppListBack
LOCAL_SHARED_LIBRARIES := libAppListBack
LOCAL_PACKAGE_NAME := AppListNew
LOCAL_CERTIFICATE := platform
include $(BUILD_PACKAGE)

include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_PREBUILT_LIBS := libAppListBack:libs/armeabi/libAppListBack.so
include $(BUILD_MULTI_PREBUILT)

#include $(call all-makefiles-under,$(LOCAL_PATH))

但是C代码我必须通过ndk构建并生成一个.so文件。 如果我取消注释最后一行,那么我的另一个makefile被执行但是它无法找到同一目录中的.cpp文件。我得到一个错误没有规则来制作'/Backend.cpp'。任何人都可以帮忙吗?

看起来像这样:

LOCAL_PATH := $(call my-dir)  
include $(CLEAR_VARS)  
LOCAL_MODULE    := AppListBack
LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llog 
LOCAL_SRC_FILES := Backend.cpp
LOCAL_C_INCLUDES += $(JNI_H_INCLUDE)
LOCAL_MODULE_TAGS := optional
#LOCAL_PRELINK_MODULE := false

include $(BUILD_SHARED_LIBRARY)  

1 个答案:

答案 0 :(得分:0)

不要在makefile(Android.mk)中编译Java。您应该使用Ant构建应用程序的Java部分。更简单 - 使用Google的ADT捆绑包等GUI环境。它甚至可以为你运行ndk-build步骤。