gpt4 book ai didi

Android Studio Native CMake 未找到原生的实现

转载 作者:太空宇宙 更新时间:2023-11-04 03:19:34 26 4
gpt4 key购买 nike

我已经更新到 Android Studio 3.0,并且正在尝试从已弃用的 NDK 迁移到 CMake,以构建我的 Android 应用的原生组件。

我已按照 https://developer.android.com/studio/projects/configure-cmake.html 上的指南进行操作这是我的 CMakeLists.txt 文件:

cmake_minimum_required(VERSION 3.4.1)
add_library( # Specifies the name of the library.
myappNative

# Sets the library as a shared library.
SHARED

# Provides a relative path to your source file(s).
src/main/cpp/src
)


include_directories(src/main/cpp/include)
SET_TARGET_PROPERTIES(myappNative PROPERTIES LINKER_LANGUAGE CXX)

(最后一行不在教程中,但在添加之前我遇到了错误)。

这是我的文件夹结构:

enter image description here

这是我的本地方法:

public class Native {

static {
System.loadLibrary("myappNative");
}

public native static String sign(String[] tokens);
}

这是我的头文件(由 javah 生成):

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_myapp_system_Native */

#ifndef _Included_com_myapp_system_Native
#define _Included_com_myapp_system_Native
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_myapp_system_Native
* Method: sign
* Signature: ([Ljava/lang/String;)Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_myapp_system_Native_sign
(JNIEnv *, jclass, jobjectArray);

#ifdef __cplusplus
}
#endif
#endif

而且我有相应的 C++ 文件可以正确编译。我的 APK 包含 libmyapp.so 文件,一切看起来都符合预期。我的应用程序构建、开始运行、加载库:(logcat)

D/dalvikvm: Trying to load lib /data/app-lib/com.myapp.myapp-1/libmyappNative.so 0x41e09aa0
D/dalvikvm: Added shared lib /data/app-lib/com.myapp.myapp-1/libmyappNative.so 0x41e09aa0

然后,当我尝试调用 native 方法时,我得到了:

W/dalvikvm: No implementation found for native Lcom/myapp/system/Native;.sign:([Ljava/lang/String;)Ljava/lang/String;

接着是:

E/AndroidRuntime: FATAL EXCEPTION: com.myapp.client.queue
Process: com.myapp.myapp, PID: 19542
java.lang.UnsatisfiedLinkError: Native method not found: com.myapp.system.Native.sign:([Ljava/lang/String;)Ljava/lang/String;
at com.myapp.system.Native.sign(Native Method)
[...]

我的应用崩溃了。我已经看到很多关于此的问题,包括 Android NDK C++ JNI (no implementation found for native...)但这些解决方案也无济于事。

在日志中,我看到:

:app:externalNativeBuildDebug
Build myappNative armeabi-v7a
[1/1] Linking CXX shared library ../../../../build/intermediates/cmake/debug/obj/armeabi-v7a/libmyappNative.so
:app:compileDebugSources

这似乎没问题。

我还在某处读到 Proguard 可能会破坏方法名称,所以我也为此添加了一条规则:

-保留类 com.myapp.system.Native

虽然我不知道它是否改变了什么。

这也是我的 gradle 文件的相关部分:

android {
compileSdkVersion 26
buildToolsVersion '26.0.2'

defaultConfig {
applicationId "com.myapp.myapp"
minSdkVersion 16
targetSdkVersion 26
versionCode 2043
versionName "2.1"
ndk {
moduleName "myappNative"
cFlags "-DNATIVE_DEBUG=1"
}

}


externalNativeBuild {
cmake {
path 'CMakeLists.txt'
}
}
}

我也试过实现一个 JNI_OnLoad 方法并在 header 中声明它,但似乎也没有找到,这可能是我的配置的一般线索,而不是具体方法:

No JNI_OnLoad found in /data/app-lib/com.myapp.myapp-2/libmyappNative.so 0x41e10aa0, skipping init

为什么Android找不到我的原生方法?

最佳答案

显然,教程中没有出现的错误(通过添加 SET_TARGET_PROPERTIES)才是关键。

我发现了问题。在我的 CMakeLists.txt 中,我引用了文件夹 src/main/cpp/src。它并没有真正编译任何文件。我已经检查过 nm(ARM 版本),但在 .so 文件中没有看到任何实际方法。然后,我在我的 CPP 文件中添加了一些垃圾(不应该编译)但构建成功完成。我最初关于正在编译 CPP 文件的假设是不正确的:工具链甚至没有尝试编译我的文件。看来我需要列出要显式编译的文件:

add_library( # Specifies the name of the library.
myappNative

# Sets the library as a shared library.
SHARED

# Provides a relative path to your source file(s).
src/main/cpp/src/com_myapp_system_Native.cpp
src/main/cpp/src/sha256.c
)

我不知道如何包含文件夹。我试过 src/main/cpp/src, src/main/cpp/src/*, src/main/cpp/src/*.cpp 但它们似乎都不起作用。更改文件后,我的应用程序开始正确运行(并加载 native 组件)。

关于Android Studio Native CMake 未找到原生的实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47732881/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com