博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android Jni开发之Android Studio教程
阅读量:6511 次
发布时间:2019-06-24

本文共 4576 字,大约阅读时间需要 15 分钟。

hot3.png

配置运行环境: Studio,我已经在电脑上安装了ndk,所以下面操作是在安装了ndk的前提下进行的。

前面几篇讲的都是在eclipse下配置和运行Jni程序,那么在Android Studio中又是如何配置和运行Jni程序呢,下面给简单说下怎样在Android Studio中引入Jni程序。

第一步,在层添加native接口,代码如下所示:

public static native String getStringFromNative();  

第二步,使用javah生成对应的头文件。java层native接口添加完成后。

首先,点击Build->Make Project,如下图所示

                                                                                  

然后,点击"View->Tool Windows->Terminal",即在Studio中进行终端命令行工具.执行如下命令生成c语言头文件,进入JniDemo\app\build\intermediates\classes\debug>路径下,添加如下操作命令

javah -jni example.vince.jnidemo.JniUtils  

执行完之后你可以在文件夹JniDemo\app\build\intermediates\classes\debug下看见生成的 .h头文件为:

example_vince_jnidemo_JniUtils.h  

以上方法过于复杂,可以通过自动化命令方式实现,具体实现方式如下:

setting/external tools/ 点击添加,进行如下配置

204205_Txof_2630477.png

保存后,右击JniUtils文件选择external tools/javah,文件自动载jni目录下生成

第三步,添加对应的.cpp文件。

 

将刚生成的.h文件剪切到main目录下的jni目录中,如果jni文件夹不存在则重新建一个jni文件夹,在jni目录下新建一个c文件,随意取名,我的叫example.vince.jnidemo.JniUtils.cpp ,然后添加对应接口的实现代码:

#include "example_vince_jnidemo_JniUtils.h"

#include <android/log.h>
#define LOG_TAG "Vince"
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)

JNIEXPORT jstring JNICALL Java_example_vince_jnidemo_JniUtils_getStringFromNative

        (JNIEnv * env, jclass jclas){

    LOGE("log from ndk.");

    return env->NewStringUTF("hello Jni");
}

第四步,NDK配置,项目中有三处地方需要进行配置。

首先,在local.properties中配置NDK路径,如下图所示:

                                                          

然后,在app\build.gradle中添加如下代码,

                                   

最后,在gradle.properties文件中添加如下代码,

android.useDeprecatedNdk=true  

 

第五步,在java层中引入生成的.so库,代码如下

static {  

        System.loadLibrary("jnidemo");  //defaultConfig.ndk.moduleName  

    }  

这时,再执行"Build->Rebuild Project",就可以编译出so文件了。

 

 

我在编译过程中出现了两个问题,

第一个错误Error: NDK integration is deprecated in the current plugin,出现这个问题是因为没有在gradle.properties中添加android.useDeprecatedNdk=true。

第二个错误Execution failed for task ':app:compileDebugNdk'. Error Code:2,在网上搜索说是在Windows下NDK一个bug,当仅仅编译一个文件时出现会出现此问题,解决方法就是再再往jni文件夹加入一个空util.c文件即可。

 

Android Studio使用gradle-experimental构建NDK工程(无需Android.mk、Application.mk文件)

字数679 阅读8226 评论21 喜欢26

本文接着上一篇的实现,来继续了解官方的另一种实验性的自动化NDK实现。

1.首先新建一个Android工程Gradle_Experimental_NDK,我们打开Gradle_Experimental_NDK/gradle/wrapper下的gradle-wrapper.properties文件,进行如下配置:

distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip

26212831_Alxi.png

Paste_Image.png

2.打开Gradle_Experimental_NDK目录下的build.gradle文件,如下图进行配置:

classpath "com.android.tools.build:gradle-experimental:0.6.0-beta5"

26212832_1wXN.png

Paste_Image.png

3.打开app目录下的build.gradle,进行配置,如下图:

26212832_76s1.png

Paste_Image.png

model {

    android {
        compileSdkVersion = 23
        buildToolsVersion = "23.0.2"

        defaultConfig.with {

            applicationId = "cn.easyar.samples.helloar"
            minSdkVersion.apiLevel  =15
            targetSdkVersion.apiLevel = 22
            versionCode = 1
            versionName = "1.0"
        }
    }
    android.buildTypes {
        release {
            minifyEnabled = false
            proguardFiles.add(file("proguard-rules.pro"))
        }
    }
    android.ndk {
        moduleName = "MyLibrary"
        //cppFlags.add("-I${file("../../../include")}".toString())
        cppFlags.add("-DANDROID")
        cppFlags.add("-fexceptions")
        cppFlags.add("-frtti")
        stl = "gnustl_static"
        ldLibs.add("log")
        ldLibs.add("GLESv2")
    }
    android.productFlavors {
        create("arm") {
            ndk.with {
                abiFilters.add("armeabi-v7a")
            }
        }
    }
    android.sources {
        main {
            jni {
                dependencies {
                    library file("../../../package/Android/libs/armeabi-v7a/libEasyAR.so") abi "armeabi-v7a"
                    library file("src/main/libs/armeabi-v7a/libavcodec.so") abi "armeabi-v7a"
                }
            }
        }
    }
}

4.创建jni目录,注意在app目录上右击鼠标,如下图:

26212832_58CB.png

Paste_Image.png

5.创建MyNdk.java文件,按照下图的操作就可以自动创建MyLibrary.c文件

/** * Created by zhangyipeng on 16/2/28. */public class MyNdk {    static {        System.loadLibrary("MyLibrary");    }    public native String getString();}

26212832_tiN0.png

Paste_Image.png

6.MyLibrary.c文件已经创建好了,如下图:

26212833_tcyj.png

Paste_Image.png

7.我们修改MyLibrary.c,让其返回字符串,代码如下:

#include 
JNIEXPORT jstring JNICALLJava_com_zhangyp_higo_gradle_1experimental_1ndk_MyNdk_getString(JNIEnv *env, jobject instance) { // 我们随便返回字符串,验证 return (*env)->NewStringUTF(env, "Hello zzyyppqq !!!");}

8.在MainActivity.java中调用,如下图

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

26212833_tpmn.png

Paste_Image.png

9.点击run就可以顺利运行了,手机运行图如下

26212833_SXP0.png

Paste_Image.png

10.使用gradle-experimental构建ndk,比以前简单多了,我们对比一下,我觉得最大的好处是Android.mk、Application.mk这两个文件再也不用写了,好开心^_^

26212833_XvNK.png

Paste_Image.png

so文件所在位置:

26212833_tu0H.png

Paste_Image.png

11.版本对应关系截图

26212833_2il3.png

Paste_Image.png

12.后记:Android Studio 2.0 Beta6 ,gradle 版本2.10-all , gradle-experimental版本0.6.0-beta5。请确保gradle版本与gradle-experimental是这两个版本。教程的build.gradle都是最简单的版本, 方便大家去了解。

13.如果需要使用Android Studio调试c/c++请看这篇文章:

14.相关资料阅读

  •  

转载于:https://my.oschina.net/leonardtang/blog/794800

你可能感兴趣的文章
ASCII码
查看>>
java常用四种排序源代码
查看>>
win7 下硬盘安装Redhat7
查看>>
Redis 分布式锁的正确实现方式
查看>>
mysqldump 备份命令使用中的一些经验总结
查看>>
Linux下MySql安装配置方法总结
查看>>
本IT博客用于域名投资、互联网、资源下载等相关干货收藏和学习
查看>>
ArrayList底层实现
查看>>
【转载】Java程序设计入门 (二)
查看>>
which、whereis、location和fand的区别
查看>>
单词最近距离
查看>>
程序猿知道英语词汇
查看>>
数据存储(两)--SAX发动机XML记忆(附Demo)
查看>>
ECSHOP添加购物车加图片飞入效果
查看>>
谈谈SQL 语句的优化技术
查看>>
ecshop如何判断缓存文件是否能更新
查看>>
javascript于boolean类型转换,运营商&amp;&amp;和|| 返回值
查看>>
Socket tips: UDP Echo service - Client code
查看>>
Loading half a billion rows into MySQL---转载
查看>>
iOS边练边学--通知机制和键盘处理小练习
查看>>