Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/178.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 使用Android NDK从.so文件调用本机函数_Java_Android_C++_Android Ndk - Fatal编程技术网

Java 使用Android NDK从.so文件调用本机函数

Java 使用Android NDK从.so文件调用本机函数,java,android,c++,android-ndk,Java,Android,C++,Android Ndk,我找到了如何利用NDK在Android中链接和使用c/c++代码的说明。我想知道的是,当你从第三方那里得到一份工作时,这个过程有多大的不同 调用System.loadLibrary()似乎可以正确加载库,但每当我尝试调用所需的方法时,都会出现一个不满意的链接错误 函数原型是根据编译.so文件的第三方提供的详细信息声明的。是否有任何方法可以有效地反编译该文件,以至少检查原型是否正确 预编译库的链接过程是否有所不同?可能我错过了一些导致链接错误的步骤 编辑: 我希望我能发代码,但我只能用手机写。我的

我找到了如何利用NDK在Android中链接和使用c/c++代码的说明。我想知道的是,当你从第三方那里得到一份工作时,这个过程有多大的不同

调用System.loadLibrary()似乎可以正确加载库,但每当我尝试调用所需的方法时,都会出现一个不满意的链接错误

函数原型是根据编译.so文件的第三方提供的详细信息声明的。是否有任何方法可以有效地反编译该文件,以至少检查原型是否正确

预编译库的链接过程是否有所不同?可能我错过了一些导致链接错误的步骤

编辑:

我希望我能发代码,但我只能用手机写。我的Android.mk文件的设置与您预期的一样,它引用了.so文件和$(prebuild_SHARED_LIBRARY)规范

我的代码所做的就是加载库并用native关键字声明函数原型。当我尝试调用函数时,我得到一个链接错误

我想知道的是,当你从第三方那里得到一份工作时,这个过程有多大的不同

这是我的一个项目的样子。该项目生成
libprng.so
。它将Crypto++用于底层PRNG(在
GetBytes
中返回字节之前,它还对传感器进行采样以重新设定PRNG的种子)

Crypto++库位于
/usr/local/cryptopp/android ARCH
,其中
ARCH
armeabi
armeabi-v7a
x86
mips

我的共享对象和Crypto++共享对象都依赖于STLport。因为多个模块依赖于STLport,所以我们必须使用STLport的共享对象版本(即,
libstlport\u shared.so

以下是Java类文件的外观:

public class PRNG {

    static {
        System.loadLibrary("stlport_shared");
        System.loadLibrary("cryptopp");
        System.loadLibrary("prng");
    }
    ...
}

应用程序.mk

APP_ABI   := armeabi x86 mips armeabi-v7a
LOCAL_PATH := $(call my-dir)

# NDK_DEBUG_IMPORTS := 1

#########################################################
# STLport library
include $(CLEAR_VARS)

STLPORT_INCL     := /opt/android-ndk-r9/sources/cxx-stl/stlport/stlport
STLPORT_LIB      := /opt/android-ndk-r9/sources/cxx-stl/stlport/libs/$(TARGET_ARCH_ABI)

LOCAL_MODULE := stlport_shared
LOCAL_SRC_FILES := $(STLPORT_LIB)/libstlport_shared.so

LOCAL_EXPORT_CPPFLAGS :=
LOCAL_EXPORT_C_INCLUDES := $(STLPORT_INCL)

include $(PREBUILT_SHARED_LIBRARY)

LOCAL_SHARED_LIBRARIES  := stlport_shared

#########################################################
# Crypto++ library
include $(CLEAR_VARS)

CRYPTOPP_INCL   := /usr/local/cryptopp/android-$(TARGET_ARCH_ABI)/include
CRYPTOPP_LIB    := /usr/local/cryptopp/android-$(TARGET_ARCH_ABI)/lib

LOCAL_MODULE       := cryptopp
LOCAL_SRC_FILES    := $(CRYPTOPP_LIB)/libcryptopp.so

LOCAL_EXPORT_CPPFLAGS := -Wno-unused-parameter -Wno-unused-variable -Wno-unused-function
LOCAL_EXPORT_C_INCLUDES := $(CRYPTOPP_INCL) $(CRYPTOPP_INCL)/cryptopp

include $(PREBUILT_SHARED_LIBRARY)

LOCAL_SHARED_LIBRARIES  := cryptopp

#########################################################
# PRNG library
include $(CLEAR_VARS)

APP_STL         := stlport_shared
APP_MODULES     := prng stlport_shared cryptopp

# My ass... LOCAL_EXPORT_C_INCLUDES is useless
LOCAL_C_INCLUDES   := $(STLPORT_INCL) $(CRYPTOPP_INCL)

LOCAL_CPP_FEATURES := rtti exceptions

LOCAL_CPP_FLAGS    := -Wno-unused-parameter -Wno-unused-variable -Wno-unused-function
LOCAL_CPP_FLAGS    += -Wl,--exclude-libs,ALL

LOCAL_LDLIBS            := -llog -landroid
LOCAL_SHARED_LIBRARIES  := cryptopp stlport_shared

LOCAL_MODULE    := prng
LOCAL_SRC_FILES := libprng.cpp

include $(BUILD_SHARED_LIBRARY)
Android.mk

APP_ABI   := armeabi x86 mips armeabi-v7a
LOCAL_PATH := $(call my-dir)

# NDK_DEBUG_IMPORTS := 1

#########################################################
# STLport library
include $(CLEAR_VARS)

STLPORT_INCL     := /opt/android-ndk-r9/sources/cxx-stl/stlport/stlport
STLPORT_LIB      := /opt/android-ndk-r9/sources/cxx-stl/stlport/libs/$(TARGET_ARCH_ABI)

LOCAL_MODULE := stlport_shared
LOCAL_SRC_FILES := $(STLPORT_LIB)/libstlport_shared.so

LOCAL_EXPORT_CPPFLAGS :=
LOCAL_EXPORT_C_INCLUDES := $(STLPORT_INCL)

include $(PREBUILT_SHARED_LIBRARY)

LOCAL_SHARED_LIBRARIES  := stlport_shared

#########################################################
# Crypto++ library
include $(CLEAR_VARS)

CRYPTOPP_INCL   := /usr/local/cryptopp/android-$(TARGET_ARCH_ABI)/include
CRYPTOPP_LIB    := /usr/local/cryptopp/android-$(TARGET_ARCH_ABI)/lib

LOCAL_MODULE       := cryptopp
LOCAL_SRC_FILES    := $(CRYPTOPP_LIB)/libcryptopp.so

LOCAL_EXPORT_CPPFLAGS := -Wno-unused-parameter -Wno-unused-variable -Wno-unused-function
LOCAL_EXPORT_C_INCLUDES := $(CRYPTOPP_INCL) $(CRYPTOPP_INCL)/cryptopp

include $(PREBUILT_SHARED_LIBRARY)

LOCAL_SHARED_LIBRARIES  := cryptopp

#########################################################
# PRNG library
include $(CLEAR_VARS)

APP_STL         := stlport_shared
APP_MODULES     := prng stlport_shared cryptopp

# My ass... LOCAL_EXPORT_C_INCLUDES is useless
LOCAL_C_INCLUDES   := $(STLPORT_INCL) $(CRYPTOPP_INCL)

LOCAL_CPP_FEATURES := rtti exceptions

LOCAL_CPP_FLAGS    := -Wno-unused-parameter -Wno-unused-variable -Wno-unused-function
LOCAL_CPP_FLAGS    += -Wl,--exclude-libs,ALL

LOCAL_LDLIBS            := -llog -landroid
LOCAL_SHARED_LIBRARIES  := cryptopp stlport_shared

LOCAL_MODULE    := prng
LOCAL_SRC_FILES := libprng.cpp

include $(BUILD_SHARED_LIBRARY)

首先,您需要方法原型与lib的设计目标相匹配,但通常packagename和类名也必须匹配

您可以使用binutils中的readelf获取.so文件中声明的符号:

readelf-s libYourLib.so

要查找的符号首先是Java,然后是包名,然后是类名,最后是方法名,
替换为

您也可以使用我开发的这个应用程序,而不用readelf:


有时只声明了
JNI\u OnLoad
方法,而不是
Java*
方法。在这种情况下,您无法直接从声明的符号中获取所需的信息。

检查这是用于JNI的第三方库吗?不能通过JNI调用任意的C++函数,只需指定名称,如<代码> JavaApPaGeNeMeAsLeMeNeNeE.MultAdMeNe()/<代码>。如果是,您是否从Java端匹配类和包名称?这个库可能不是为你的包和类而建的。我没有考虑过类和包命名。我被告知该类是用于JNI的,但我得到的只是函数原型和.so文件。