【问题标题】:Android Static vs Shared LibraryAndroid静态与共享库
【发布时间】:2011-08-03 09:43:36
【问题描述】:

我有一个 android 项目,它由一个 java 文件和两个 ndk 库一个 C++ 和其他 JNI 组成。 JNI 共享库加载 C++ 静态库并调用其中一个方法。这是所有文件..

Android.mk

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := Lib2
LOCAL_SRC_FILES := Lib2.cpp
include $(BUILD_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := Lib1
LOCAL_SRC_FILES := Lib1.cpp
LOCAL_SHARED_LIBRARIES := Lib2
include $(BUILD_SHARED_LIBRARY)

Lib1.h

#include <jni.h>
extern "C"
    {
    JNIEXPORT void JNICALL Java_mine_twocpplibtest_TwocpplibtestActivity _TestMethod(JNIEnv * env, jobject obj);
    };

Lib1.cpp

#include <jni.h>
#include "Lib1.h"
#include "Lib2.h"
using namespace Lib2ns;

JNIEXPORT void JNICALL Java_mine_twocpplibtest_TwocpplibtestActivity_TestMethod(JNIEnv * env, jobject obj)
{
    Lib2::TestChanged();
}

Lib2.h

#ifndef Lib2_HEADER
#define Lib2_HEADER

using namespace std;

namespace Lib2ns
{
    class Lib2
    {
        public:
            static void  TestChanged();
    };
}
#endif

Lib2.cpp

#include "Lib2.h"
using namespace Lib2ns;

void Lib2::TestChanged()
{
}

这是我加载 Lib1 的活动

public class TwocpplibtestActivity extends Activity 
{
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }

    static
    {
        System.loadLibrary("Lib1");
    }
}

当我将Lib2 定义为include $(BUILD_STATIC_LIBRARY) 时,问题出现在Android.mk 文件中,一切正常,但是当我将Lib2 定义为include $(BUILD_SHARED_LIBRARY) 时,我的活动在尝试加载Lib1 时崩溃。任何想法为什么会这样?我们不能在一个项目中同时拥有两个共享库吗?

【问题讨论】:

    标签: android android-ndk


    【解决方案1】:

    这个怎么样?

    static
    {
        System.loadLibrary("Lib2");
        System.loadLibrary("Lib1");
    }
    

    您的 apk 必须包含 libLib2.so 作为 libLib1.so。

    【讨论】:

    • Lib2 真的被加载了吗? "尝试加载 lib /data/data/mine.Twocpplibtest/lib/libLib2.so 添加共享库 /data/data/mine.Twocpplibtest/lib/libLib2.so"
    • 不,日志中没有任何相关内容
    【解决方案2】:

    LOCAL_PATH := $(call my-dir)

    包括 $(CLEAR_VARS)

    LOCAL_MODULE := Lib2

    LOCAL_SRC_FILES := Lib2.cpp

    包括 $(BUILD_STATIC_LIBRARY)

    包括 $(CLEAR_VARS)

    LOCAL_MODULE := Lib1

    LOCAL_SRC_FILES := Lib1.cpp

    LOCAL_STATIC_LIBRARIES := Lib2

    包括 $(BUILD_SHARED_LIBRARY)

    “Lib2”是一个静态库,你应该使用 LOCAL_STATIC_LIBRARIES

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多