美文网首页
NDK开发之helloworld

NDK开发之helloworld

作者: 陌上冰火 | 来源:发表于2017-12-19 11:59 被阅读0次

    一,流程

      1. 新建java文件,声明本地方法,loadlibrary
      2. 用javah.exe,生成.h文件
      3. 新建Android.mk
      4. 新建Application.mk
      5. 新建.cpp文件,拷贝.h文件中的方法,并实现
      6. 用ndk-build.exe,build生成so库
      7. 拷贝so库到你的项目中,即可开始使用

    二,环境搭建

      1. 在Android Studio中配置NDK
      进入File->Project Structure,打开Project Structure窗口

      未配置ndk路径时,左下方会有个download按钮,可以点击下载

      下载完成后,配置ndk-bundle的路径,如下图:     配置完成后,刷新项目,在项目local.properties文件中会看到新增了一行ndk的配置:
      2. Android Studio中配置插件javah.exe ndk-build.cmd
      进入File->Settings->Tools->External Tools,点击 + 号增加

    javah -jni命令,是根据java文件生成.h头文件的,会自动根据java文件中的类名(包含包名)与方法名生成对应的C/C++里面的方法名。下面是参数配置及其含义:
    1). Program: JDKPath\bin\javah.exe
        这里配置的是JDK目录下的javah.exe的路径(根据实际情况填写)。
    2). Parametes: -classpath . -jni -d ModuleFileDir/src/main/jni FileClass
        这里FileClass指的是要执行操作的类名(即我们操作的java文件),
        ModuleFileDir/src/main/jni表示生成的文件保存在这个module目录的src/main/jni目录下。
    3). Working directory: ModuleFileDir\src\main\java module目录下的src\main\java目录(不是很理解)。

    使用方式:选中java文件—>右键—>External Tools—>javah-jni,将生成jni文件夹以及文件夹下的 包名.类名的.h头文件 (名字过长,我们可以自己重命名)。

    ndk -build命令,是根据C/C++文件生成so文件的。下面是参数配置及其含义:
    1). Program: F:\apk\sdk\ndk-bundle\ndk-build.cmd
    这里配置的是ndk下的ndk-build.cmd的路径(根据实际情况填写)。
    2). Working directory: ModuleFileDir\src\main
    设置工作目录为当前module下的src/main目录下。

    使用方式:选中C/C++文件—>右键—>ExternalTools—>ndk-build,将在main文件夹下生成libs文件夹以及多个so文件,我们可以移动至jniLibs目录下去。

    三,简单实例

      1. 创建访问本地C/C++方法的java类文件

      图中标记的包名,类名,方法名,以及so库名称需与.h以及.cpp文件中一致。

     2. 右键点击刚刚创建的java文件,选择External Tools->javah-jni,自动生成.h文件以及jni目录。
      3. 在.h同级目录下,新建Android.mk文件
      4. 在.h同级目录下,新建Application.mk文件
      5. 在.h同级目录下,新建.cpp文件

      图中方法的第二个参数类型,必须与.h文件中的类型一致,否则生成的so库,会找不到本地方法。该参数的类型也可以是jobject,这里统一改成jclass。

      6. 右键点击.cpp文件,选择External Tools->ndk-build
      build完成后,会自动生成libs和obj两个目录,libs目录下存放着各个版本的so库
      7. 将libs下的so库拷贝到项目libs目录下,删除新生成的jni,libs,obj目录,在module级build.gradle文件中,添加配置jni路径
      8. 新建Activity 在activity中调用本地方法

    四,运行结果

    五,出错情况

      1. java.lang.UnsatisfiedLinkError: No implementation found for java.lang.String com.ancloud.test.JniTest.getStringFromC()

        找不到本地方法。可能原因:
          cpp文件中,没有include .h头文件;
          cpp文件中的方法名参数,与.h头文件中的方法名,参数不一致;

      2. 尝试了直接return “hello world”;

        找不到本地方法 结果ndk-build时,会报错
        暂时不理解为什么一定要用return env->NewStringUTF("Hello jni with me!");这种写法,后续再更新。。。

    相关文章

      网友评论

          本文标题:NDK开发之helloworld

          本文链接:https://www.haomeiwen.com/subject/xmcvwxtx.html