Android Studio 2.2 在已有项目中添加NDK

1、加载库与编写native方法

Android Studio 2.2 在已有项目中添加NDK_第1张图片

2、在Terminal命令窗口下进入到java文件夹,执行如下命令:javah  包名.类名,生成头文件。

3、在项目的main文件夹下新建一个cpp文件夹,然后新建一个cpp文件,这个文件名要与代码System.loadLibrary("patch")中的参数名称相同。在这里我把文件名定为patch

4、把在第二步中生成的头文件中的方法复制到,patch.cpp中。在头文件中的方法名如下:
      JNIEXPORT jstring JNICALL Java_com_example_eric_filepatch_MainActivity_getStringFromNative(JNIEnv *, jobject); 
  
    以上的写法在调用的时候出现问题,我把它改成以下的写法
    extern "C" jstring Java_com_example_eric_filepatch_MainActivity_getStringFromNative(JNIEnv *env, jobject);
    这样就可以正常使用了。
     其中extern “C” 是表示当代码使用C与C++混编时,指示编译器按照C语言进行编译。在extern “C” 中include进去的文件不能再有extern “C”, 因为extern “C”不能再有
     extern “C”。
    当include文件时,相当于把代码拷贝了一份放到该文件中
5、在local.properties文件下添加如下代码:
      ndk.dir=D\:\\Android\\android_sdk\\android_sdk\\ndk-bundle
6、在app文件夹下新建一个CMakeLists.txt文件,内容如下
    
    
# Sets the minimum version of CMake required to build the native
# library. You should either keep the default value or only pass a
# value of 3.4.0 or lower.

cmake_minimum_required(VERSION 3.4.1)

# Creates and names a library, sets it as either STATIC
# or SHARED, and provides the relative paths to its source code.
# You can define multiple libraries, and CMake builds it for you.
# Gradle automatically packages shared libraries with your APK.

add_library( # Sets the name of the library.
             patch

             # Sets the library as a shared library.
             SHARED

             # Provides a relative path to your source file(s).
             # Associated headers in the same location as their source
             # file are automatically included.
             src/main/cpp/patch.cpp )

# Searches for a specified prebuilt library and stores the path as a
# variable. Because system libraries are included in the search path by
# default, you only need to specify the name of the public NDK library
# you want to add. CMake verifies that the library exists before
# completing its build.

find_library( # Sets the name of the path variable.
              log-lib

              # Specifies the name of the NDK library that
              # you want CMake to locate.
              log )

# Specifies libraries CMake should link to your target library. You
# can link multiple libraries, such as libraries you define in the
# build script, prebuilt third-party libraries, or system libraries.

target_link_libraries( # Specifies the target library.
                       patch

                       # Links the target library to the log library
                       # included in the NDK.
                       ${log-lib} )

    其中带有#号的代码是注释,说明如下

   # 指定cmake最低版本,如果不知道就复制吧
   cmake_minimum_required(VERSION 3.4.1)

   # 第一个native-lib是供java调用的文件, SHARED是啥没看明白但是要写上
   # 最后是所有cpp的名字,这里在一个文件夹中就直接写名字了,文件有多少写多少,假如有 patch.cpp和 Max.cpp,记得写上路径
  add_library(patch SHARED src/main/cpp/patch.cpp src/main/cpp/Max.cpp)

  # 我的理解是java要连接到patch,和一些其它的东西,不懂
  target_link_libraries(patch)

7、在app的build.gradle中添加如下代码
  
      Android Studio 2.2 在已有项目中添加NDK_第2张图片

    8、生成so文件
          首先在CMakeLists文件中添加如下的代码:
          set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/../jniLibs/${ANDROID_ABI})
          该行代码的作用是把生成的so文件输出到指定的目录,在这里是输出到jniLibs文件夹下,改行代码的位置要在以下代码的下面
          cmake_minimum_required(VERSION 3.4.1)
          然后再build.gradle中添加需要输出的so文件类型,如下图所示。
Android Studio 2.2 在已有项目中添加NDK_第3张图片1
   
然后就可以运行了。当然还有另外一种在原有的项目中添加NDK开发的方式,使用的是android.mk文件。在这里就不介绍了。

参考:http://blog.csdn.net/lmw21848/article/details/52183584
CMake:http://www.hahack.com/codes/cmake/

你可能感兴趣的:(android)