Android JNI在C代码中使用预先构建的.so文件

时间:2014-05-18 10:19:45

标签: android gcc android-ndk java-native-interface shared-libraries

我正在尝试使用Android JNI。 到目前为止,我刚刚编写了基本的Hello World Android JNI应用程序。 现在我在想是否有可能单独构建一个.so文件。然后在我的JNI Layer C Code中使用该库。

所以基本上我想在windows中使用命令行gcc构建一个libsample.so。然后在我为我的Android应用程序编写的JNI中使用此.so文件。 从我的理解到目前为止,我应该能够通过编辑Android.mk文件来做到这一点。

但那些编辑会是什么?

编辑:附加源代码。

jnitest.cpp -

#include <jni.h>
#include "specialPrint.h"

extern "C" jstring Java_com_example_hwjni_MainActivity_helloFromJni(JNIEnv *env, jobject thiz) {
    return env->NewStringUTF(SpecialPrint("This is external .so talking."));
}

specialPrint.h -

#include <stdio.h>
#ifdef __cplusplus
extern "C" {
#endif
char* SpecialPrint(char* s);
#ifdef __cplusplus
}
#endif

specialPrint.c -

#include <stdio.h>
#include "specialPrint.h"

char* SpecialPrint(char* s) {
    return s;
}

Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := MyPrebuiltLib
LOCAL_SRC_FILES = specialPrint.c
include $(BUILD_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE    := jnitest
LOCAL_SRC_FILES := jnitest.cpp
LOCAL_SHARED_LIBRARIES := MyPrebuiltLib
include $(BUILD_SHARED_LIBRARY)

P.S。 - 虽然现在我正在尝试使用源代码执行此操作。但最终我真的需要在没有specialPrint源的情况下做这些事情。如果你可以帮助我实现那么那就太棒了!

1 个答案:

答案 0 :(得分:0)

步骤1:将预建库声明为模块 第2步:将预建模块称为本地共享库

例如

include $(CLEAR_VARS)
LOCAL_MODULE := MyPrebuiltLib
LOCAL_SRC_FILES = path/to/libSuper.so
include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := DroidJNILib
LOCAL_SRC_FILES := AwsomeCode.cpp
LOCAL_SHARED_LIBRARIES := MyPrebuiltLib
include $(BUILD_SHARED_LIBRARY)

如果您有来源

include $(CLEAR_VARS)
LOCAL_MODULE := MyPrebuiltLib
LOCAL_SRC_FILES =mysource.cpp
include $(BUILD_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := DroidJNILib
LOCAL_SRC_FILES := AwsomeCode.cpp
LOCAL_SHARED_LIBRARIES := MyPrebuiltLib
include $(BUILD_SHARED_LIBRARY)