Java 如何在jni中链接预构建so
我已经创建了一个带有声明的头文件“abc.h”Java 如何在jni中链接预构建so,java,android,c++,android-ndk,java-native-interface,Java,Android,C++,Android Ndk,Java Native Interface,我已经创建了一个带有声明的头文件“abc.h” int abc(); 然后,我创建了一个带有定义的.cpp文件“abc.cpp” int abc() { return 10; } 现在我从上面的文件创建了一个libabc.so库 然后我创建了一个HelloWorld Android项目。然后我在jni中创建了一个lib文件夹,并将libabc.so文件放入init 现在,我在jni文件夹中创建了另一个文件“xyz.cpp”,它希望使用abc()函数。 但是当我运行ndk build命令
int abc();
然后,我创建了一个带有定义的.cpp文件“abc.cpp”
int abc()
{
return 10;
}
现在我从上面的文件创建了一个libabc.so库
然后我创建了一个HelloWorld Android项目。然后我在jni中创建了一个lib文件夹,并将libabc.so文件放入init
现在,我在jni文件夹中创建了另一个文件“xyz.cpp”,它希望使用abc()
函数。
但是当我运行ndk build
命令时,我得到了这个错误。
错误:未定义对函数abc的引用
这是xyz.cpp文件。
int getAbcFunction()
{
int value = abc();
// return value;
}
jni-->lib文件夹中的Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := abc-prebuild
LOCAL_SRC_FILES := libabc.so
LOCAL_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
# Here we give our module name and source file(s)
LOCAL_MODULE := helloworld
LOCAL_SRC_FILES := xyz.cpp
LOCAL_SHARED_LIBRARIES := abc-prebuild
include $(BUILD_SHARED_LIBRARY)
jni文件夹中的Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := abc-prebuild
LOCAL_SRC_FILES := libabc.so
LOCAL_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
# Here we give our module name and source file(s)
LOCAL_MODULE := helloworld
LOCAL_SRC_FILES := xyz.cpp
LOCAL_SHARED_LIBRARIES := abc-prebuild
include $(BUILD_SHARED_LIBRARY)
如何解决此错误。将“abc.h”添加到xyz.cpp的开头将“abc.h”添加到xyz.cpp的开头如果您使用的是Android Studio,默认情况下会忽略Make文件,因为所有配置都应该使用gradle或gradle实验插件进行 但是,这些还不支持本机预构建,因此您应该停用默认支持并自己调用ndk构建:
android.sources{
main.jni {
source {
srcDirs 'src/main/none' //deactivate built-in compilation
}
}
main.jniLibs {
source {
srcDir 'src/main/libs' //integrate .so files from src/main/libs
}
}
}
顺便说一句,这与你的问题并不完全相关,但你有:
LOCAL_SRC_FILES := libabc.so
这意味着您打算对NDK支持的所有体系结构(armeabi、armeabi-v7a、arm64-v8a、x86、x86_64、mips、mips64)使用此预构建(armeabi?)即使它们不兼容。你应该这样做
LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libabc.so
如果您使用的是Android Studio,默认情况下会忽略Makefiles,因为所有配置都应该使用gradle或gradle实验插件进行 但是,这些还不支持本机预构建,因此您应该停用默认支持并自己调用ndk构建:
android.sources{
main.jni {
source {
srcDirs 'src/main/none' //deactivate built-in compilation
}
}
main.jniLibs {
source {
srcDir 'src/main/libs' //integrate .so files from src/main/libs
}
}
}
顺便说一句,这与你的问题并不完全相关,但你有:
LOCAL_SRC_FILES := libabc.so
这意味着您打算对NDK支持的所有体系结构(armeabi、armeabi-v7a、arm64-v8a、x86、x86_64、mips、mips64)使用此预构建(armeabi?)即使它们不兼容。你应该这样做
LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libabc.so
而是使用不同版本的.so文件。包含此头文件后,会出现相同的错误包含此头文件后,会出现相同的错误运行
ndk build V=1
查看调用编译器的参数,如果这不能指导您正确的方向,将该信息添加到此问题中。运行ndk build V=1
查看调用编译器时使用的参数,如果这不能指导您正确的方向,请将该信息添加到此问题中。