Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/223.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
导入现有的c++;库(.a或.so文件)ndk android_Android_Android Ndk_Java Native Interface_.a_.so - Fatal编程技术网

导入现有的c++;库(.a或.so文件)ndk android

导入现有的c++;库(.a或.so文件)ndk android,android,android-ndk,java-native-interface,.a,.so,Android,Android Ndk,Java Native Interface,.a,.so,我刚刚用android进行了原生开发。我成功地为本机开发做好了AndroidStudio 2.2.2准备 我还构建了示例hello jni项目 我正在努力实现的目标 我尝试使用C++中设计的一个现有的库(我将提供静态库 .扩展名> .SO 文件 关于本土发展的一些困惑 1)我是否应该使用现有C++库的.CPP和.h文件来代替 > < >或>强> 2) 我是否需要制作CMakeLists.text:我在谷歌上搜索了我的。文件不是使用ndk build生成的,所以我需要制作它 如果我使用.cp

我刚刚用android进行了原生开发。我成功地为本机开发做好了AndroidStudio 2.2.2准备

我还构建了示例hello jni项目

我正在努力实现的目标

我尝试使用C++中设计的一个现有的库(我将提供静态库<强> .<强>扩展名> <强> .SO 文件

关于本土发展的一些困惑

1)我是否应该使用现有C++库的.CPP和.h文件来代替<强> > < <强> >或>强> 2) 我是否需要制作CMakeLists.text:我在谷歌上搜索了我的。文件不是使用ndk build生成的,所以我需要制作它

如果我使用.cpp和.h文件,我应该使用Android.mk&Application.mk

CMakeLists.text是否将我新开发的android项目编译为库或现有的.a文件

3) 在我的项目中,.a文件放在哪里。它在jni文件夹下吗?


C++ java文件(4))我的Java类文件应该定义具有<强>关键字的原生< /强>相同的方法,如在C++文件中实现的(示例:在C++文件方法名GETDATA()中,如果Java类包含公共本机GETDATA())

注释:这个答案不显示在编写本机(C++)代码后如何使用CMASE。对于该设置,请阅读下面的答案以充分了解该设置,然后查看


好的,你有很多问题。其中一些问题属于个人偏好类型,但我将提供它们作为我的个人选择

#一, 这是你的选择。一、 我个人会使用编译的
.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号 这些都与该选项无关

#四, 无论您使用的是文件还是已编译的库,都必须执行以下操作:

@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);
}
然后,您可以从
活动
/
片段
调用这些方法

希望这足够清楚


编辑(基于下面的评论)
  • .so
    .a
    文件是您的本机库

  • .cpp
    .c
    等文件只是您的本地源代码文件。如果要在项目中使用这些文件,则必须使用生成系统(例如,CMake)来使用它们。CMake将获取您的源代码文件并创建一个
    。因此
    库,它又是本机库。这就是为什么我建议使用
    .so
    文件的原因,因为为什么不需要在项目中实现CMake

  • 如果您想尝试CMake或在将来学习它,请检查以下答案:

  • System.loadLibrary(“my_native_lib”):这里告诉Java运行时添加这个给定的库。这样,你就可以在java和C++内部的代码之间创建链接。该行下面的方法应该与它们在C++/C代码中的名称相同。这样,Java运行时将查找并打开库,并在加载的库中查找这些方法。看更多
  • 这可能会帮助您从

    直接从APK打开共享库

    在API级别23及更高版本中,可以直接从APK打开.so文件。只需像平常一样使用System.loadLibrary(“foo”),但在AndroidManifest.xml中设置android:extractNativeLibs=“false”。在旧版本中,.so文件是在安装时从APK文件中提取的。这意味着它们占用了APK中的空间,并且再次占用了安装目录中的空间(这被计入您的账户,并作为您的应用程序占用的空间报告给用户)。任何要直接从APK加载的.so文件都必须在zip文件中与页面对齐(以4096字节为边界),并以未压缩方式存储。zipalign工具的当前版本负责对齐

    请注意,在API级别23及以上版本中,dlopen(3)将从任何zip文件打开库,而不仅仅是您的APK。只需给dlopen(3)一个“my_zip_file.zip!/libs/libstuff.so”形式的路径。与APK一样,该库必须与页面对齐并未压缩存储,才能正常工作


    非常感谢你的回答。我对“本地图书馆”这个词感到非常困惑。1)我从.so文件(在'jn'文件夹中)访问C++方法时编写的代码称为本地库,或者我从C++库(如数学函数)使用的方法称为本地库或My .so或.file。这行写的是System.loadLibrary(“my_native_lib”);我正在加载什么?我已编辑了我的答案,以向您提供更多详细信息。查看我的本地项目是否使用VisulaStudio完成。任何方式将C++源文件添加到Android Studio并生成。这将是伟大的,如果这发生是这样做,看看这个链接。这是最简单的解决方案。你能帮我看看我的Android.mk文件应该是怎样的吗?根据你的模式,我很好地浏览了这个链接,然后我感到困惑。