在已有项目的基础上通过新建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)
站点信息
- 文章2305
- 用户1336
- 访客11455538
每日一句
Talent without working hard is nothing.
没有努力,天份不代表什么。
没有努力,天份不代表什么。
MySQL 数据库优化
This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its de
免ROOT实现模拟点击任意位置
Mobaxterm终端神器
CreateProcessW要注意的细节问题
Autonomous NAT Traversal
【教程】win10 彻底卸载edge浏览器
eclipse工程基于Xposed的一个简单Hook
排名前5的开源在线机器学习
Mac OS最简单及(Karabiner)快捷键设置
发一款C++编写的麻将
VMware NAT端口映射外网访问虚拟机linux
独家发布最新可用My-AutoPost——wordpress 采集器
新会员