【问题标题】:Android makefile include dynamic library runtime errorAndroid makefile 包含动态库运行时错误
【发布时间】:2013-08-09 01:53:59
【问题描述】:

我正在尝试使用 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)

我只是从我的主要活动类中实例化这个类以进行测试。 (新后端();) 但是我收到运行时错误。有人可以解释我做错了什么吗?我只是这方面的新手。

# 编辑: 我想出了如何编写正确的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))

但是我必须通过 ndk 构建 C 代码并制作一个 .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)  

【问题讨论】:

  • 糟糕,这毕竟是一个 andorid-source 问题。我错过了什么吗?
  • 所以,您有用于 Java 应用程序的${AppListNew}/Android.mk 文件和用于ibAppListBack.so${AppListNew}/jni/Android.mk 文件,还有${AppListNew}/jni/Backend.cpp 文件。但第二个文件寻找的是/Backend.cpp。是这种情况吗?
  • @AlexCohn 嗨,实际上我放弃了使用 jni 来支持使用套接字的想法,因为我的 C 应用程序需要一些我无法使用 jni 解决的特殊权限。我做了一个socket并通过java代码生成了C exe,然后建立了一个socket并传递了数据。

标签: java android makefile java-native-interface


【解决方案1】:

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

【讨论】:

  • 我有一些必要通过makefile来做。应该可以像我上面那样做,不是吗?
  • 支持的构建 Android 应用程序的方法是 use ant。是的,你可以从make调用ant release(使用APK文件作为目标,很难列出这个目标所依赖的所有文件)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-24
  • 1970-01-01
相关资源
最近更新 更多