我刚刚完成了 android 的原生开发。我成功地让我的 AndroidStudio 2.2.2 准备好进行原生开发
我还构建了示例 hello-jni 项目
我正在努力实现的目标
我正在尝试使用用 c++ 设计的现有库(我将获得静态库 .a 扩展名或 .so 文件)
关于原生开发的一些困惑
1) 我应该使用现有 c++ 库的 .cpp 和 .h 文件而不是 .a 或 .so 文件吗?
2) 我需要制作 CMakeLists.text 吗:据我搜索,我的 .a 文件 不是使用 ndk-build 生成的> ,所以我需要做到这一点。
如果我使用 .cpp 和 .h 文件 ,我应该制作 Android.mk 和 Application.mk
CMakeLists.text 将我新开发的 android 项目编译为库还是我现有的 .a 文件?
3) 我应该把.a 文件放在我项目的什么地方。它在 jni 文件夹下吗?
4) 我的 java 类文件是否应该使用 关键字 native 定义方法,就像在 c++ 文件中实现的一样(示例:在 c++ 文件方法名称 getData() 中,java 类是否应该包含 public native getData( ) )
最佳答案
注意:此答案并未说明在编写 native (C++) 代码后如何使用 CMake。对于该设置,请阅读下面的答案以全面了解该设置,然后查看 this answer .
好的,您有很多问题。其中一些问题属于个人偏好类型,但我会根据个人选择提供它们。
#1
这是你的选择。我个人会使用编译后的 .so
文件。这样我就永远不必担心 NDK 和 CMake 以及 .mk 文件。如果你有这个文件,你所要做的就是将文件添加到 libs
文件夹(而不是 lib
文件夹)并对你的 build. gradle
文件。就是这样。
更改为 build.gradle:
sourceSets {
main {
manifest.srcFile 'AndroidManifest.xml'
java.srcDirs = ['src']
res.srcDirs = ['res']
assets.srcDirs = ['assets']
jniLibs.srcDirs = ['libs']
}
}
#2 & 3 这些与此选项无关。
#4 无论您使用文件还是编译的库,您都必须这样做:
@SuppressWarnings("JniMissingFunction")
public class MyNativeMethods {
static {
System.loadLibrary("my_native_lib");
}
public native int native_method_1(int fd);
public native int native_method_2(int fd);
public native void native_method_3(int fd, int arr[]);
public native int[] native_method_4(int fd);
}
然后,您可以从您的 Activity
/Fragment
调用这些方法。
希望这已经足够清楚了。
编辑(基于以下评论):
.so
或.a
文件是您的原生库。.cpp
、.c
等文件只是您的 native 源代码文件。如果要在项目中使用这些文件,则必须使用构建系统(例如 CMake)来使用它们。 CMake 会获取您的源代码文件并制作一个.so
库,这又是 native 库。这就是为什么我建议使用.so
文件的原因,因为为什么在不需要时在项目中执行 CMake 的工作?
如果以后想尝试或学习CMake,请查看此答案:C/C++ with Android Studio version 2.2
System.loadLibrary("my_native_lib");
:在这里您告诉 Java 运行时添加这个给定的库。通过这种方式,您可以在 Java 和库中的 C++ 代码之间创建链接。该行下面的方法的名称应与它们在 C++/C 代码中的名称相同。这样 Java 运行时将找到并打开库并在您加载的库中查找那些方法。查看更多here
关于android - 导入现有的 c++ 库(.a 或 .so 文件)ndk android,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40415510/