我有一个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}}。任何想法为什么会这样?我们不能在项目中一次拥有两个共享库吗?
答案 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