在已有项目的基础上通过新建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
- 访客11369120
每日一句
Sometimes not getting what you want is good luck.
得不到想要的,有时反而是幸运。
得不到想要的,有时反而是幸运。
热血传奇,梦开始的地方!
Intellij Idea可执行jar文件打包步骤
10年后,Android应用程序仍然比iOS应用程序差
socket编程之常用api介绍与socket、select、poll、epoll高并发服务器模型代码实现
Swift 4.0扩展 WCDB 支持 SQL 语句
How to Ungroup Icons on Windows 11 Taskbar With a Registry Hack (and 2 More Ways)
Linux查看进程及相关操作常用命令
亲测!虚拟机VirtualBox安装MAC OS 10.12图文教程
C++实现远程下载EXE并执行
微信小程序自定义组件的使用以及调用自定义组件中的方法
电信天翼网关超级密码获取
win10利用winsat disk测试磁盘读写速度
T440S完美黑苹果mac10.14.1上图求点赞!
新会员