在Android Studio中使用C ++共享对象的问题

问题描述 投票:-1回答:1

我试图了解android studio如何使用共享库“.so”文件。他们简单的Hello World with C ++工作正常,但我正在努力将一大堆C ++代码移植到android,并希望了解最简单的方法。我不一定要将CMakeLists.txt文件添加到Android Studio,因为某些代码不是使用cmake构建的。

我所做的是在Android Studio中创建了两个项目。支持C ++的Hello World C ++,工作正常。我还创建了一个Hello World Java(没有C ++)支持。

我的目标是获取在Hello World CPP项目中创建的libnative-lib.so文件,将它们复制到Hello World Java并更改Java代码以引用stringFromJNI()函数。

在Java版本中,我创建了apps / src / main / jniLibs目录,并从CPP版本复制整个目录./app/build/intermediates/transforms/mergeJniLibs/debug/0/lib/。这些是我带来的文件。

〜/ AndroidStudioProjects / HelloJava / app / src / main / jniLibs $ ls -R .: arm64-v8a armeabi-v7a x86 x86_64

./arm64-v8a:libnative-lib.so

./Rambbha:Bentiflub

./x86:libnative-lib.so

./x86_64:libnative-lib.so

然后我回到Java版本的MainActivity类并复制了

  static {
        System.loadLibrary("native-lib");
    }

并将以下内容添加到onCreate的末尾。 (我将ID添加到布局中,因此R.id.sample_text有效。)

TextView tv = (TextView) findViewById(R.id.sample_text);
tv.setText(stringFromJNI());

构建工作正常,但当我尝试在AVD上运行时,我收到以下错误。

E/.gary.hellojav: No implementation found for java.lang.String com.example.gary.hellojava.MainActivity.stringFromJNI() (tried Java_com_example_gary_hellojava_MainActivity_stringFromJNI and Java_com_example_gary_hellojava_MainActivity_stringFromJNI__)
D/AndroidRuntime: Shutting down VM

我删除了stringFromJNI调用,它在AVD中运行正常。我已经将loadLibrary调用中的库名称更改为无效的东西,并且loadLibrary抛出异常,因此它似乎找到了库,我只是无法解析stringFromJNI名称。

我的任何建议或明显的疏忽?

java c++ android-studio shared-libraries
1个回答
0
投票

我发现了这个问题。由于项目名称嵌入stringFromJNI,因此当我从一个项目移动到下一个项目时,native-lib.cpp文件中的问题,完全限定名称不正确。我需要改变

Java_com_example_gary_hcpp_MainActivity_stringFromJNI

Java_com_example_gary_hjava_MainActivity_stringFromJNI
© www.soinside.com 2019 - 2024. All rights reserved.