kar*_*nji 13 java-native-interface android android-ndk .a .so
我刚刚在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类文件是否应该定义具有与c ++文件中实现的关键字本机相同的方法(例如:在c ++文件方法名称getData()中,java类应该包含公共本机getData())
ᴛʜᴇ*_*ᴛᴇʟ 16
好的,你有很多问题.其中一些问题是个人偏好类型,但我会将它们作为我个人的选择.
这是你的选择.我个人会使用编译后的.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']
}
}
Run Code Online (Sandbox Code Playgroud)
这些与此选项无关.
无论您使用文件还是编译库,都必须执行此类操作:
@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);
}
Run Code Online (Sandbox Code Playgroud)
然后,您可以从Activity/ 调用这些方法Fragment.
希望这很清楚.
1).so或.a文件是您的本机库.
2) .cpp,.c等文件只是你的本地源代码文件.如果您要在项目中使用这些文件,则必须使用构建系统(例如,CMake)来使用它们.CMake将获取您的源代码文件并创建一个.so同样是本机库的库.这就是为什么我建议使用这些.so文件,因为为什么在你不需要时在你的项目中实现CMake的工作呢?
如果您想尝试CMake或将来学习它,请查看以下答案:使用Android Studio 2.2版的C/C++
3)System.loadLibrary("my_native_lib");:在这里,您要告诉Java运行时添加此给定的库.这样,您就可以在Java和库中的C++代码之间创建链接.该行下面的方法应该与它们在C++/C代码中的名称相同.这样,Java运行时将找到并打开库,并在您加载的库中查找这些方法.在这里查看更多
| 归档时间: |
|
| 查看次数: |
16006 次 |
| 最近记录: |