如何更新Android jni代码更改 目前我正在开发一个包含java和C++原生代码的库的应用程序。因为库项目是一个Eclipse项目,所以我在Eclipse中导入了它,使用“添加本机支持”函数创建了Android.mk和Application.mk,然后将该项目重新导入Android Studio 我启动应用程序,它工作得很好:但是现在如果我想在本地C++代码中做一些更改,我认识到如果我重新启动项目,应用程序就不会显示这些更改。p>

如何更新Android jni代码更改 目前我正在开发一个包含java和C++原生代码的库的应用程序。因为库项目是一个Eclipse项目,所以我在Eclipse中导入了它,使用“添加本机支持”函数创建了Android.mk和Application.mk,然后将该项目重新导入Android Studio 我启动应用程序,它工作得很好:但是现在如果我想在本地C++代码中做一些更改,我认识到如果我重新启动项目,应用程序就不会显示这些更改。p>,android,c++,eclipse,android-ndk,java-native-interface,Android,C++,Eclipse,Android Ndk,Java Native Interface,我将我的解决方案与谷歌的许多示例项目进行了比较(例如“hello jni”),在那里,我的变化会立即被识别并显示在智能手机上 我看到的唯一区别是Android.mk文件,它对于谷歌示例来说非常简单,对于我的项目库来说非常大……只是作为一名java开发人员,我觉得有点难以理解,这个文件在做什么以及如何修改它。它看起来如下所示 LOCAL_PATH := $(call my-dir) $(info TARGET_ARCH_ABI is $(TARGET_ARCH_ABI)) $(info

我将我的解决方案与谷歌的许多示例项目进行了比较(例如“hello jni”),在那里,我的变化会立即被识别并显示在智能手机上

我看到的唯一区别是Android.mk文件,它对于谷歌示例来说非常简单,对于我的项目库来说非常大……只是作为一名java开发人员,我觉得有点难以理解,这个文件在做什么以及如何修改它。它看起来如下所示

    LOCAL_PATH := $(call my-dir)

$(info TARGET_ARCH_ABI is $(TARGET_ARCH_ABI))

$(info LOCAL_PATH is $(LOCAL_PATH))

PREBUILT_LIBS := $(LOCAL_PATH)/../libs/libraryWithNativeCode/prebuilt/android-$(TARGET_ARCH_ABI)

include $(CLEAR_VARS)
LOCAL_MODULE := libraryWithNativeCode-sdk-lib
LOCAL_SRC_FILES := $(PREBUILT_LIBS)/libraryWithNativeCode-sdk.a
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := png-lib
LOCAL_SRC_FILES := $(PREBUILT_LIBS)/libpng.a
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/../libs/libraryWithNativeCode/png
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := curl-lib
LOCAL_SRC_FILES := $(PREBUILT_LIBS)/libcurl.a
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/../libs/libraryWithNativeCode/curl/android-$(TARGET_ARCH_ABI)
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := ssl-lib
LOCAL_SRC_FILES := $(PREBUILT_LIBS)/libssl.a
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := crypto-lib
LOCAL_SRC_FILES := $(PREBUILT_LIBS)/libcrypto.a
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := http-parser-lib
LOCAL_SRC_FILES := $(PREBUILT_LIBS)/libhttp-parser.a
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/../libs/libraryWithNativeCode/http-parser
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := jpeg-lib
LOCAL_SRC_FILES := $(PREBUILT_LIBS)/libjpeg.a
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := turbojpeg-lib
LOCAL_SRC_FILES := $(PREBUILT_LIBS)/libturbojpeg.a
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/../libs/libraryWithNativeCode/jpeg-turbo
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)

LOCAL_MODULE := libraryWithNativeCode-mobile-example-app
LOCAL_LDLIBS := -llog -landroid -lEGL -lGLESv2 -lz -lm
LOCAL_LDLIBS += -fuse-ld=bfd
LOCAL_STATIC_LIBRARIES := libraryWithNativeCode-sdk-lib png-lib curl-lib ssl-lib crypto-lib http-parser-lib jpeg-lib turbojpeg-lib android_native_app_glue ndk_helper

LOCAL_CFLAGS += -Wall -Wno-unknown-pragmas -Wno-sign-compare -Wno-format-security -Wno-reorder
#LOCAL_CFLAGS += -Werror

ifdef COMPILE_CPP_11
  $(info Configured for C++11)
  LOCAL_CPPFLAGS += -DCOMPILE_CPP_11=1 -std=c++11
else
  $(info Configured for C++0x)
endif

os_name:=$(shell uname -s)

get_android_cpp_files_cmd := find $(LOCAL_PATH) -type f  -iname "*.cpp"
get_android_includes_cmd  := find $(LOCAL_PATH) -type d
get_shared_cpp_files_cmd  := find $(LOCAL_PATH)/src -type f  -iname "*.cpp"
get_shared_includes_cmd   := find $(LOCAL_PATH)/src -type d
get_platform_includes_cmd := find $(LOCAL_PATH)/../libs/libraryWithNativeCode/platform -type d ! -path "*/OSX/*" ! -path "*/iOS/*"


ifeq ($(os_name),Darwin)
    cppfiles := ${shell ${get_android_cpp_files_cmd}}
    cppfiles += ${shell ${get_shared_cpp_files_cmd}}

    includes := ${shell ${get_android_includes_cmd}}
    includes += ${shell ${get_shared_includes_cmd}}
    includes += ${shell ${get_platform_includes_cmd}}
else
    # assume windows if not specified for now (due to no uname)
    cppfiles := ${shell sh -c '${get_android_cpp_files_cmd}'}
    cppfiles += ${shell sh -c '${get_shared_cpp_files_cmd}'}

    includes := ${shell sh -c '${get_android_includes_cmd}'}
    includes += ${shell sh -c '${get_shared_includes_cmd}'}
    includes += ${shell sh -c '${get_platform_includes_cmd}'}
endif


LOCAL_SRC_FILES := $(cppfiles:$(LOCAL_PATH)/%=%)
LOCAL_C_INCLUDES := $(includes)

LOCAL_C_INCLUDES += $(LOCAL_PATH)/../libs/libraryWithNativeCode/rapidjson
LOCAL_C_INCLUDES += $(LOCAL_PATH)/../libs/libraryWithNativeCode/rapidjson/internal

include $(BUILD_SHARED_LIBRARY)

$(call import-module,android/native_app_glue)
$(call import-module,android/ndk_helper)
我的文件夹结构如下:

- Android_Studio_Project
--.gradle
--.idea
--app
---src
----main (etc)
--libraryProjectWithNativeCode
---src
----main
-----java (contains the java code)
-----jni (contains the jni code)
-----jniLibs
-----etc.
--build.gradle etc.

有人知道如何解决这个问题吗?提前谢谢:)

没问题<代码> $(CPPPFrase:< /Cord>)是一个动态收集的C++源文件列表。您不需要手动更新此列表。只需调用
ndk build
即可重建本机部分。

目前,Android Studio会动态创建一个新的Makefile,并编译来自
jni/
的所有源代码。不幸的是,它不能处理预编译的libs依赖

gradle将很快发布更好的NDK支持,但在此期间,您可以停用当前的NDK支持,并自己调用NDK build:

android {
    sourceSets.main {
        jni.srcDirs = [] //disable the built-in ndk-build call with auto-generated Android.mk
    }
}
ndk build将把生成的.so文件放在
libs/armeabi,x86,
文件夹中,但Android Studio希望它们放在
jniLibs/armeabi,x86,
文件夹中。调用ndk build后,您可以手动移动它们,或者更改
jniLibs
目录的位置,如下所示:

android {
    sourceSets.main {
        jniLibs.srcDir 'src/main/libs' //set libs as .so's location instead of jniLibs
        jni.srcDirs = [] //disable the built-in ndk-build call with auto-generated Android.mk
    }
}
如果您愿意,甚至可以让gradle调用ndk build:

import org.apache.tools.ant.taskdefs.condition.Os
...     
android {
    ...

    sourceSets.main {
        jniLibs.srcDir 'src/main/libs' //set libs as .so's location instead of jniLibs
        jni.srcDirs = [] //disable automatic ndk-build call with auto-generated Android.mk
    }

    // call regular ndk-build(.cmd) script from app directory
    task ndkBuild(type: Exec) {
        if (Os.isFamily(Os.FAMILY_WINDOWS)) {
            commandLine 'ndk-build.cmd', '-C', file('src/main').absolutePath
        } else {
            commandLine 'ndk-build', '-C', file('src/main').absolutePath
        }
    }

    tasks.withType(JavaCompile) {
        compileTask -> compileTask.dependsOn ndkBuild
    }
}

您好mAlters,您好$(cppfiles)包含我所有的源文件,我刚刚编辑了文件包含的路径,但是当我调用
ndk build
时,我现在得到一个错误,我的一个include语句找不到:
Types.h:没有这样的文件或目录
。。。有没有办法解决这个问题?这就是
$(includes)
的目的。哦,是的,很明显。我在文件夹中搜索了Types.h并找到了它,我用来保存到
$(includes)
变量中的路径也是正确的。该文件位于文件夹
/Users/jenny/appproject/libraryProjectWithNativeCode/src/main/jniLibs/platform
中。我打印了我的
$(includes)
变量,并在其中列出了路径…但错误仍然存在…我已经在其他帖子中看到了此解决方案,但不幸的是,这对我不起作用。我最终在Eclipse中导入了这个项目,并在Eclipse中构建了.so文件……但感谢您的回答:)