Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/198.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.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
Java 如何在应用程序项目中使用android本机代码_Java_Android_C++_Java Native Interface_Native Methods - Fatal编程技术网

Java 如何在应用程序项目中使用android本机代码

Java 如何在应用程序项目中使用android本机代码,java,android,c++,java-native-interface,native-methods,Java,Android,C++,Java Native Interface,Native Methods,我需要访问本机代码(android操作系统内部)并通过jni接口在我的应用程序中使用它 例如:访问内部的void NuPlayer::HTTPLiveSource::start(){..}方法 我从中发现,这可以通过两个选项实现: 使用android完整源代码树构建您的项目 您可以将include文件复制到项目中 我不能使用选项1,所以我尝试使用选项2。。。我是jni的新手,因此想知道: 在我的项目中包含哪些文件 如何访问本机方法 这是一种经得起未来考验的方法吗?(我已经看到源文件会根据操作

我需要访问本机代码(android操作系统内部)并通过jni接口在我的应用程序中使用它

例如:访问内部的
void NuPlayer::HTTPLiveSource::start(){..}
方法

我从中发现,这可以通过两个选项实现:

  • 使用android完整源代码树构建您的项目
  • 您可以将include文件复制到项目中
  • 我不能使用选项1,所以我尝试使用选项2。。。我是jni的新手,因此想知道:

    • 在我的项目中包含哪些文件
    • 如何访问本机方法
    • 这是一种经得起未来考验的方法吗?(我已经看到源文件会根据操作系统版本移动到不同的文件夹中)
    任何提示或详细解释都会非常有用。

    我的项目中包含哪些文件

    这取决于你的项目。通常,您可以使用增量方法:当您的编译器抱怨缺少包含时,转到Google source并克隆其Git存储库的相关部分。但是也可以下载完整的AOSP树

    请注意,在最后阶段,您将需要非NDK共享库来链接您的.so。最简单的方法是从目标设备中提取
    /system/lib
    中的所有库。但如果愿意,您可以使用模拟器

    如何访问本机方法

    您应该构建使用JNI与Java应用程序通信的本机代码包装器共享库。有时,这是一个很薄的层,它本质上向Java公开了所有底层方法的全部优点。但是最好聚合本机访问(毕竟,每个JNI遍历都有其固有的开销),并提出一个高级的易于使用的JNI类,它将处理本机对象、线程,你可以说

    这是一种经得起未来考验的方法吗?(我已经看到源文件会根据操作系统版本移动到不同的文件夹中)

    不,它不能100%保证在将来工作,甚至不能在您没有明确测试的设备上工作。这不仅适用于本机代码的使用,也适用于未记录的JavaAPI。OTOH,将源文件移动到不同的文件夹(如stagefright的4.2版本)之类的更改不一定会导致不兼容

    我是jni的新手


    我想说,使用系统库需要的不仅仅是对JNI和Android NDK的基本理解。在深入研究之前,我强烈建议您先学习或学习类似的书籍。

    感谢您的回复,兄弟……消除了许多困惑。关于增量方法,如果我的机器上有源代码,并且我将MediaPlayer.cpp文件复制到我的项目中,如果我将依赖项作为机器上存在的AOSP源的绝对路径提供,它会编译吗。。。如果我的机器上没有AOSP源代码,我是否必须在项目本身中包含所有依赖项(头文件、cpp文件)…您可能不需要在项目中使用系统的
    MediaPlayer.cpp
    ,您可能希望通过链接
    -lmedia
    并使用必要的包含文件来使用其功能。通过AOSP源树的绝对路径使用这些include文件是可以的,但是您可能只需要构建该树的一个非常稀疏的部分,这与将所有这些文件复制到项目中基本相同。IMHO最干净的方法是使用指向AOSP的符号链接,包括jni目录下的某个目录。很抱歉,当我询问是否可以调用MediaPlayer.cpp(setDataSource..)的方法时,我听起来有点幼稚(我是新手)在我的项目中使用jni而不包含MediaPlayer.cpp文件的java代码。什么是-lmedia,什么是符号链接?对大量信息感到困惑,谢谢:)我真的不知道从哪里开始……正如我所说,你的任务需要的不仅仅是对JNI和Android NDK的基本理解。从系统和程序员的角度了解Linux的基本知识。这些都是SO答案中无法涵盖的主题。有厚厚的书专门介绍他们,或讲座课程每几天。我有一个线程“这是我要找的…回到你有任何疑问…谢谢朋友!!