这段时间在Android上做java/C++混合开发,用到了NDK。
1:静态库与动态库的Android.mk格式
1.1:目录结构:
jni
android.mk
lua
android.mk
…
1.2: 顶层android.mk (注意红色字体部分)
JNI_PATH := $(call my-dir)
LOCAL_PATH := $(JNI_PATH)include $(call all-makefiles-under,$(LOCAL_PATH))
LOCAL_PATH := $(JNI_PATH)include $(CLEAR_VARS)
LUA_INC := ../../../zdc/external/lua-5.1.4/src
ZUTIL_INC := ../../../zdc/utillib/include ../../../zdc/utillib/android/zutil-jni/jni
GL_SNOB_INC := ../../lib/ ../../glmsgLOCAL_C_INCLUDES := $(JNI_H_INCLUDE) $(LUA_INC) $(ZUTIL_INC) $(GL_SNOB_INC)
LOCAL_CXX_INCLUDES := $(JNI_H_INCLUDE) $(LUA_INC) $(ZUTIL_INC) $(GL_SNOB_INC)ZUTIL_FLASG := -DBSTRLIB_DOESNT_THROW_EXCEPTIONS -DZUTIL_OSTYPE=ZUTIL_ANDROID
LOCAL_CFLAGS := -Werror $(ZUTIL_FLASG)
LOCAL_CPPFLAGS := -Werror $(ZUTIL_FLASG)LOCAL_MODULE := snob-jni
TARGET_PRELINK_MODULES := false
#LOCAL_CFLAGS := -Werror $(ZUTIL_FLASG)SNOB_JNI_FILES := snob_adapter.cpp /
glroot-jni.cppLOCAL_SRC_FILES := $(SNOB_JNI_FILES)
LOCAL_STATIC_LIBRARIES := libsnoblib libzutil liblua51
LOCAL_LDLIBS := -llog
include $(BUILD_SHARED_LIBRARY)
注:
1:LOCAL_STATIC_LIBRARIES 后面静态库的顺序有严格讲究,被包含的lib需要放在包含的后面
2:LOCAL_LDLIBS := -llog 可以使用__android_log_print打印log
1.3:子目录android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := lua51
LOCAL_MODULE_FILENAME := liblua51
LOCAL_SRC_FILES := …
2: Cpp文件jni格式
#include <android/log.h>
#define LOG_TAG "libhellojni"
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__)extern "C" {
JNIEXPORT jstring Java_com_zdc_zutil_ZutilJni_stringFromJNI( JNIEnv* env, jobject thiz );
}
JNIEXPORT jstring Java_com_zdc_zutil_ZutilJni_stringFromJNI( JNIEnv* env, jobject thiz )
{
return env->NewStringUTF( (char *)"HelloJni cpp test");
}
此种方式可以不用写Load接口