失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > NDK JNI Android Studio开发与调试DEMO(三)(生成 .so 文件)

NDK JNI Android Studio开发与调试DEMO(三)(生成 .so 文件)

时间:2019-09-05 04:55:46

相关推荐

NDK  JNI Android Studio开发与调试DEMO(三)(生成 .so 文件)

Android Studio NDK 开发与调试(生成 .so 文件)

温馨提示:如果你的 Android Studio 版本在 3.0以上 , 建议你用 cMake /ndk-build 的新姿势进行 NDK 开发 : https://developer./index.html

AS与genymotionh和虚拟机的具体配置见:/qq_22605739/article/details/46711213

(1). 环境搭建与基本配置

见我的博客/darlingqiang/article/details/79049638

俗话说 “工欲善其事,必先利其器” ;所以咱还是得先下载 ndk;

下载地址 :/ndk/downloads/index.html

File-->ProjectStructure

如果你已经下载,直接选择你 ndk 的位置;

如果没有下载,在红色框这个位置会有位置提示你下载,点击下载就行;

添加 ndk 后你会在 local.properties 这个文件看到(路径取决于你 ndk 的位置):

接着进行下一步:

在此处加上这句代码:android.useDeprecatedNdk=true

(2).第二步. class文件的生成(java 代码与 c 代码编写)

按照图片中的指示找到对应的合适的位置建立Java类,首先新建个 java 类

public class JniTest{static {System.loadLibrary("jary");}public native String getString();}

然后重新编译下你的 Project: Build-->Make Project(Ctrl+F9)

KEY ONE:重新编译之后就可以在对应的文件夹看到编译后的 JniTest.class

sun@sun:~/AS/JniTest/app/build/intermediates/classes/debug/com/sun/jnitest(根据具体情况调整)

(3)下一步来看怎么生成 .h 的文件

在 studio 打开 Terminal 命令行工具,打开步骤是 View-->Tool Windows-->Terminal (Alt+F12)

在命令行中先进入到工程的 main 目录下

输入命令:javah -d jni -classpath 自己编译后的 class 文件的绝对路径

ndk { moduleName "jary" //生成的so名字 abiFilters "armeabi", "armeabi-v7a", "x86" //输出指定三种abi体系结构下的so库。 stl "stlport_static" //打开.c 的 debug , 下面第 4 点会讲到}

KEY TWO 绝对路径:javah -d jni -classpath javah -d jni -classpath ~/AS/JniTest/app/build/intermediates/classes/debug+具体

注意 debug 后面是有个空格的,如图:

命令执行后会在 main 目录下(在哪个目录下执行就会在哪个目录下生成 .h 文件)自动生成 “jni” 文件夹,

同时生成一个 .h 的文件

这个 .h 文件可不做修改 ;默认就行

现在我们来写一个测试的 C 文件 jary.c 同 .h 文件一样放到 jni 文件夹下,代码如下:

// Created by sun on 18-1-14. // #include <jni.h> #include "JniTest.h" JNIEXPORT jstring JNICALL Java_JniTest_getString (JNIEnv *env,jobject jobject1){ return (*env)->NewStringUTF(env,"Hello Jni !") }

依赖刚才生成的 .h 头文件 ; 方法名与 .h 里面方法名保持一致 ;

最后在在app中的test中的 build.gradle里面的

defaultConfig 中添加如下代码

ndk { moduleName "jary" //生成的so名字 abiFilters "armeabi", "armeabi-v7a", "x86" //输出指定三种abi体系结构下的so库。 stl "stlport_static" //打开.c 的 debug , 下面第 4 点会讲到}

到这里,jni 调 C 就完成了,现在我们来测试一下,写个 TextView 显示一下调用的 C:

public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);TextView tvJni = (TextView) findViewById(R.id.tvJni);tvJni.setText(new JniTest().getString());}}

效果如下图 :

(4). 生成 .so 以及调用

编译后的 .so 文件如下图路径:

根据这个路径就可以找到指定输出的三种体系结构下的 .so 文件,然后把 .so 文件复制出来,如下图所示的放到 jniLibs 文件夹下

注意:放到 jniLibs 文件夹下面,build.gradle 里面 不用配置

还有一种方式是将 .so 文件 放在 libs 文件夹下面,注意在 build.gradle 添加如下配置:

4. 关于ndk开发在 .c 文件里面的 debug

首先在 build.gradle 中添加如下代码 :

android {... ...defaultConfig {... ...ndk { moduleName "jary" //生成的so名字 abiFilters "armeabi", "armeabi-v7a", "x86" //输出指定三种abi体系结构下的so库。 stl "stlport_static" //打开.c 的 debug (此句是打开的debug的关键)}}buildTypes {debug { jniDebuggable true //此句不加在真机上 debug 不受影响,但是在虚拟机上不能 debug}}

配置后如下图 ,会出现一个 app-native,选择此项你就可以尽情的 debug 了

debug 如下图

如果觉得《NDK JNI Android Studio开发与调试DEMO(三)(生成 .so 文件)》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。