已经存在的Android Studio工程添加NDK支持

Home / Android 百晓生 2018-2-25 5219

在已有项目的基础上通过新建module的方式添加ndk支持,如果不想创建module 忽略新建module的步骤即可,其他一致。 

1. 创建的工程添加一个module 

A:File > new Module> Android Library ,如图

创建好了之后,在原来工程的设置里面把新加的module关联起来。选中主工程,按F12键,如下图


2.在module 中新建一个 Java文件 SdkNative.java,并创建一个native方法 add();

package com.example.ndklibrary;
/**
 * Created by Lee on 2018/2/25.
 */
public class SdkNative {
    static {
        System.loadLibrary("sdklib");
    }
    public native int add(int a,int b);
}

3. 通过javah 命令生成相应的头文件, 

左侧导航窗口SdkNative.java 上,右键 > External Tools > javah 

PS: External tools 中的javah 需要自己配置,详见javah配置步骤,步骤差不多,javah 参数信息如下,仅供参考 

-classpath . -jni -d $ModuleFileDir$/src/main/jni $FileClass$
$ModuleFileDir$\src\main\java

4. 创建 C++ 文件 

javah 命令会自动生成 jni的头文件以及相应的jni目录,需要注意的是 AndroidStudio中显示的目录为cpp 但是在文件系统中实际是jni目录(新建工程时勾选C++支持的区别)。后续CMakeLists.txt中需要特别注意路径。 

cpp目录下右键 新建C++ sourceFile,新建一个sdknative.cpp的C++ 文件。

//
// Created by Lee on 2018/2/25.
//
#include "com_example_ndklibrary_SdkNative.h"
JNIEXPORT jint JNICALL Java_com_example_ndklibrary_SdkNative_add(JNIEnv *, jobject, jint a, jint b) {
    return a + b;
}

5. 在ndklibrary的根目录下创建CMakeLists.txt文件(跟src 同级目录) 

内容如图 

cmake_minimum_required(VERSION 3.4.1)
add_library(sdklib
             SHARED
             src/main/jni/sdknative.cpp
             )
target_link_libraries(sdklib
                       log)

6. 修改ndklibrary的build.gradle 配置文件,添加ndk支持;

apply plugin: 'com.android.library'
android {
    compileSdkVersion 26
    defaultConfig {
        minSdkVersion 15
        targetSdkVersion 26
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        externalNativeBuild {
            cmake {
                cppFlags "-frtti -fexceptions"
            }
        }
        ndk {
            moduleName "sdklib"
            abiFilters "armeabi"
        }
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    externalNativeBuild {
        cmake {
            path "CMakeLists.txt"
        }
    }
}
dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:26.1.0'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.1'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
}

7.运行Activity效果如下图

package com.example.lee.multiproject;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
import com.example.ndklibrary.SdkNative;
public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        SdkNative sdkNative = new SdkNative();
        TextView textView = findViewById(R.id.id_text_value);
        textView.setText(String.format("%d+%d=%d", 2, 3, sdkNative.add(2, 3)));
    }
}

本文链接:https://www.it72.com/12313.htm

推荐阅读
最新回复 (0)
返回