如何更新安卓 jni 代码更改
How to update Android jni code changings
目前我正在开发一个应用程序,其中包含一个由Java和本机C ++代码组成的库。因为库项目是一个 Eclipse 项目,所以我在 Eclipse 中导入了它,创建了带有"添加本机支持"功能的 Android.mk 和 Application.mk,然后将项目重新导入到 Android Studio 中。
我启动了该应用程序,它:)工作得很好但是现在,如果我想在本机 c++ 代码中进行一些更改,我认识到如果我重新启动项目,应用程序不会显示这些更改。
我将我的解决方案与谷歌的许多示例项目(例如"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.
有人知道如何解决这个问题吗?提前致谢:)
没问题。 $(cppfiles)
是动态收集的C++源文件列表。您无需手动更新此列表。只需调用ndk-build
即可重建本机部分。
目前Android Studio会即时创建一个新的Makefile,并从jni/
编译所有源代码。不幸的是,它无法处理预编译的库文件。
来自 gradle 的更好的 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
}
}
如果你愿意,你甚至可以让 ndk-build 被 gradle 调用:
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
}
}
- Winapi - SetWindowLongPtr in ShutdownBlockReason创建/销毁JNI本机代码
- 使用 jni 将返回带有模板的对象的 Java 代码转换为 c++
- 使用 x86_64-w64-mingw32-g++ 编译 JNI C++本机代码
- 我能否通过 JNI 调试在本机代码中创建的 JVM?
- Android 无法从本机代码调用 Java 方法 JNI
- 将String从JNI(C )代码返回到Java
- 在 JNI 中使用错误的代码将 jbytearray 转换为 char*
- 相机崩溃:带JNI代码的致命信号6(Sigabrt)
- JNI 代码返回字符串,但得到错误 java.lang.UnsatisfiedLinkError: com.packag
- JNI代码中的不满意的LinkError
- 避免在JNI代码中的内存泄漏
- 如何从 JNI 代码进行 JNIT 测试回调
- LD_PRELOAD JNI 代码中的变量
- Android JNI代码中的C++异常-再次
- JVM 无法按预期方式处理包含名为 "Node" 的类的 JNI C++代码
- 在Android中对终端用户模糊JNI代码
- 使用android-ndk-r10e编译jni代码时出错
- 从Android内核中拆分一些JNI c++代码
- 如何更新安卓 jni 代码更改
- 调试混合JNI代码的方法