在已有项目的基础上通过新建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))); } }
收藏的用户(0) X
正在加载信息~
推荐阅读
最新回复 (0)
站点信息
- 文章2302
- 用户1336
- 访客10968998
每日一句
Qingming Festival invites us to honor ancestors with quiet reflection and respect.
清明节邀请我们以静思与敬意祭奠祖先。
清明节邀请我们以静思与敬意祭奠祖先。
新会员