Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/202.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在jni中链接预构建so_Java_Android_C++_Android Ndk_Java Native Interface - Fatal编程技术网

Java 如何在jni中链接预构建so

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命令

我已经创建了一个带有声明的头文件“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
命令时,我得到了这个错误。
错误:未定义对函数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
查看调用编译器时使用的参数,如果这不能指导您正确的方向,请将该信息添加到此问题中。