File -> New -> New Project
勾选Include C++ Support
Next
选择Empty Activity
Next
Customize C++ Support
C++ Standard选择Toolchain Default
Finish
工程创建完成后,点击运行即可
运行完成后,点击菜单Build -> Analyze APK可以看到lib目录下的so文件
看一下示例工程相关文件
可以通过在现有工程中修改这些地方进行NDK编程
顶层目录下的local.properties文件
会指定ndk和sdk的目录
ndk.dir=C\:\\androidstudio\\sdk\\ndk-bundle sdk.dir=C\:\\androidstudio\\sdk
顶层目录下的build.gradle文件
可以看到gradle插件不再使用实验性的了
需要2.2.0版本或以上
buildscript { repositories { jcenter() } dependencies { classpath 'com.android.tools.build:gradle:2.2.1' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } }
app目录下的build.gradle文件
新增加了externalNativeBuild节
使用CMake,不需要使用ndk-build了
指定了CMakeLists.txt的路径,这个文件名称固定为CMakeLists.txt
android { compileSdkVersion 24 buildToolsVersion "24.0.3" defaultConfig { applicationId "com.example.jiang.hellojnitest" minSdkVersion 19 targetSdkVersion 24 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" externalNativeBuild { cmake { cppFlags "" } } } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } externalNativeBuild { cmake { path "CMakeLists.txt" } } }
看下CMakeLists.txt文件
使用add_library增加新的so文件
使用find_library使用已有的库,比如android的log库
使用target_link_libraries链接库
# 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. native-lib # 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/native-lib.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. native-lib # Links the target library to the log library # included in the NDK. ${log-lib} )
看下建立的MainActivity.java
库的加载和native的声明
public class MainActivity extends AppCompatActivity { // Used to load the 'native-lib' library on application startup. static { System.loadLibrary("native-lib"); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // Example of a call to a native method TextView tv = (TextView) findViewById(R.id.sample_text); tv.setText(stringFromJNI()); } /** * A native method that is implemented by the 'native-lib' native library, * which is packaged with this application. */ public native String stringFromJNI(); }
看下src\main\cpp\目录下的native-lib.cpp文件
实现了native函数
#include <jni.h> #include <string> extern "C" jstring Java_com_example_jiang_hellojnitest_MainActivity_stringFromJNI( JNIEnv *env, jobject /* this */) { std::string hello = "Hello from C++"; return env->NewStringUTF(hello.c_str()); }