如何解决让本机代码在 Android Studio 的模块中工作的问题
我正在尝试构建一个 Android 库,该库包含调用 C++ 代码的本机代码和 Java 代码。 C++ 严格限于库。我设法编译了一个项目,但是当我启动单元测试时,出现找不到库的异常。
我查了一下,代码确实生成了 .so 文件,但就是找不到。
因此,我创建了一个空的活动项目,并在其中为 Android 库创建了一个模块。
在其中,我将我的代码和一个 from builtins import round
文件放在 src/main/cpp
目录中:CMakeLists.txt
:
libnative.cpp
#include "libnativeJNI.h"
#ifdef __cplusplus
extern "C" {
#endif
JNIEXPORT jint JNICALL GEN_FUNCNAME(TestFunction)(JNIEnv *jenv,jobject jobj)
{
return 0;
}
#ifdef __cplusplus
}
#endif
:
libnative.h
#ifndef NDKTROUBLESHOOT_LIBNATIVEJNI_H
#define NDKTROUBLESHOOT_LIBNATIVEJNI_H
#include "jni.h"
#define GEN_FUNCNAME(FUNCNAME) Java_com_java_libnative_libnative_##FUNCNAME
#endif //NDKTROUBLESHOOT_LIBNATIVEJNI_H
:
CMakeLists.txt
我还在模块内更新了 gradle 以编译本机代码,方法是在 cmake_minimum_required(VERSION 3.10.2)
project("LibNative")
add_library(LibNative SHARED libnativeJNI.cpp)
find_library(log-lib log)
target_link_libraries(LibNative ${log-lib})
部分添加以下几行:
android
本机代码链接到 externalNativeBuild {
cmake {
path file('src/main/cpp/CMakeLists.txt')
}
}
中的 Java 类:src/main/java/com/java/libnative/
:
libnative.java
我还可以看到在库中编译的本机代码为 package com.java.libnative;
public class libnative {
static
{
System.loadLibrary("LibNative");
}
private native int TestFunction();
public libnative()
{
TestFunction();
}
}
。
现在,IDE 可以识别原生函数,但我在模块中创建了一个单元测试来测试它是否真的有效:
libnative/build/intermediates/cmake/debug/obj/{Architecture}/libLibNative.so
但是,这样做会在运行时触发异常:
package com.java.libnative;
import org.junit.Test;
public class UnitTest {
@Test
public void library_canLoad()
{
new libnative();
}
}
我缺少什么才能完成这项工作?
解决方法
事实证明,正如 Michael 所提到的,测试环境不支持本地库的加载。我通过将其发送到捆绑在应用程序中的手机测试了相同的代码,并且运行良好。
因此,在这种情况下,不幸的是不能使用单元测试来测试库。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。