Android静态与共享库

时间:2011-08-03 09:43:36

标签: android android-ndk

我有一个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");
    }
}

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

2 个答案:

答案 0 :(得分:0)

这个怎么样?

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

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

答案 1 :(得分:0)

LOCAL_PATH:= $(致电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