用Android Studio 执行ndk 程序

近期准备研究一下android双进程守护,因为此前用eclipse 写jni习惯了。如今主要用as 工具。在此也试着写个demo 然后在对双进程守护进行研究

1、所需工具

 android studio 1.4

 ndk :android-ndk-r9d

….其他必备在此就不叙述

2、演示样例介绍

1)、项目创建

打开as 创建一个project 输入包名 com.cayden.jnis

在此假设採用as 生成的布局和activity ,兴许执行会出现故障。

详细兴许在问题部分会进行说明

2)、创建jni java类

java 调用c/c++ 须要jni中间桥梁

详细代码例如以下

package com.cayden.jnis;

/**
 * Created by cuiran on 16/2/27.
 */
public class JniUtils {

    public native String getCLanguageString();

    static {
        System.loadLibrary("JniUtils");
    }
}

3)、生成h 创建c文件

须要编译将class文件生成相应h文件

详细看图片中的命令

进入build/intermediates/classes/debug下

然后在src/main下创建jni文件夹,将此前生成的文件com_cayden_jnis_JniUtils.h 剪切到此文件夹下,并新建文件 jnitest.c

//
// Created by 崔冉 on 16/2/27.
//

#include "com_cayden_jnis_JniUtils.h"

/*
 * Class:     com_cayden_jnis_JniUtils
 * Method:    getCLanguageString
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_cayden_jnis_JniUtils_getCLanguageString
        (JNIEnv *env, jobject obj){

    return (*env)->NewStringUTF(env,"I‘m jni");
}

4)、改动activity并进行调用

详细參考代码

package com.cayden.jnis;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        JniUtils jniUtils=new JniUtils();

        TextView tv=(TextView)findViewById(R.id.textView);
        tv.setText("jni result:"+jniUtils.getCLanguageString());
    }

}

5)、 配置ndk及其生成so文件名

在local.properties文件加入ndk.dir=/Users/cuiran/tool/android-ndk-r9d

改动build.gradle 文件

apply plugin: ‘com.android.application‘

android {
    compileSdkVersion 19
    buildToolsVersion ‘19.1.0‘

    defaultConfig {
        applicationId "com.cayden.jnis"
        minSdkVersion 14
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"

    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile(‘proguard-android.txt‘), ‘proguard-rules.pro‘
            ndk{
                moduleName "JniUtils"             //生成的so名字
                abiFilters "armeabi", "armeabi-v7a", "x86"  //输出指定三种abi体系结构下的so库。
            }
        }

        debug{
            ndk{
                moduleName "JniUtils"             //生成的so名字
                abiFilters "armeabi", "armeabi-v7a", "x86"  //输出指定三种abi体系结构下的so库。
            }
        }
    }
}

dependencies {
    compile fileTree(dir: ‘libs‘, include: [‘*.jar‘])

}

3、执行效果

执行后,显示了在c里面写的内容I’m jni

可是回到项目文件夹下 发现没有看到生成的so文件 可是我们将apk反编译就能够看到。貌似as还是蛮强大的。

能够看一下 反编译后的截图

4、问题整理

1) 报错:“NDK integration is deprecated in the current plugin”的

解决的方法:打开project文件夹下的gradle.properties文件。并在该文件里写入以下这行:

android.useDeprecatedNdk=true

不出意外的话,再次编译project,NDK环境这块就OK了。

2) 报错:error: jni.h: No such file or directory

解决的方法:将compileSdkVersion和targetSdkVersion改成19就编译通过了

时间: 07-28

用Android Studio 执行ndk 程序的相关文章

用Android Studio 运行ndk 程序

最近准备研究一下android双进程守护,由于此前用eclipse 写jni习惯了,现在主要用as 工具.在此也试着写个demo 然后在对双进程守护进行研究 1.所需工具 android studio 1.4 ndk :android-ndk-r9d -.其它必备在此就不叙述 2.示例介绍 1).项目创建 打开as 创建一个project 输入包名 com.cayden.jnis 在此如果采用as 生成的布局和activity ,后续运行会出现问题. 具体后续在问题部分会进行说明 2).创建jn

Mac下Android studio 之NDK配置教程

Mac下Android studio 之NDK配置教程(一) 1.概述 最近项目全线转移到Mac下使用使用Android studio开发.遇到关键代码封装到 ***native***层,此时在win下的NDK配置步骤全部失效. 为此,花费了大量时间用来查阅资料,在此,记录下来,分享给大家供以后配置中作为参考. 2.环境 本人使用的开发配置 是:MAC OS 10.10 +androioid studio 1.2+android-ndk-r10e-darwin-x86_64+git .其他配置类

Android Studio 使用NDK开发

Android Studio 使用NDK编程 使用Android Studio有半年多了,感觉很好用,不就感觉费劲的就是NDK的支持一直不是很好,再Bate版的时候好像0.4.x之前可以使用NDK,当然本身Android Studio本身是支持NDK编译的,下面我就来解释一下怎么使用Android Studio来编译. 很简单,首先要创建你的项目,创建完成之后点击项目右键new->Folder->JNI Folder,如图 然后就生成了jni文件夹 再往里面添加你的c/cpp文件和Androi

[Android] 环境优化配置Android Studio发展NDK

======================================================== 作者:qiujuer 博客:blog.csdn.net/qiujuer 站点:www.qiujuer.net 开源库:Genius-Android 转载请注明出处:http://blog.csdn.net/qiujuer/article/details/42040963 ========================================================

Android Studio 运行java程序

当我们装了Android Studio 学习安卓开发的时候,难免会要学习java,这时候,难道在重新装一个编译器吗?不需要,我们直接用 Android Studio 就可以. 1.新建一个空项目,选择红色项目 2.File ----->  new -----> new Module...   然后弹出一个框  在more module 里面选择java  Library .一路next. 3.编写相应的代码,记得把上面的第一行注释掉 4.配置,点击 run -> edit configu

使用Android Studio进行ndk开发的准备

1. gradle-ex2. ndk开发包3. 项目目录结构4. lldb调试器 1. 一般来说gradle不是必需的,gradle也是可以进行ndk编译的,然而你需要在编译时使用更多(多于一个)c++编译选项时,以及让IDE可以使用lldb进行调试,或者是针对ndk开发和编译有更好的支持时,gradle-ex就是你所需要的.gradle-ex的ex不是扩展而是experimental实验非正式.它对ndk相关的配置进行了增强,同时又语法不兼容gradle,并且在ndk相关以外的配置沿着的是gr

Android Studio运行安卓程序报Failure [INSTALL_FAILED_OLDER_SDK]的解决办法

http://androidren.com/index.php?qa=320&qa_1=android-studio运行安卓程序报failure-install_failed_older_sdk 一般情况是最小支持的sdk版本高于当前设备的Android系统版本,这时候需要修改manifest和build.gradle两个地方. 修改源码app目录下的"build.gradle"文件,将其中的minSdkVersion .targetSdkVersion 修改为跟manifes

Android Studio NFC 读写卡程序 (二)

上一章简单的介绍了 一下NFC android 中的认识 和配置,这次认识一下NFC 卡片. 卡片一共 分为16个扇区(sector),每个扇区又分为4个块(block) 每个块 包含16个字节, 比如“1234567890123456”, “ASDFGHJKLQWERTYU”,可以存取一些信息, 因为卡片的类型不同,所以在存取的时候需要注意一下, 比如 对于一般的 MifareClassic 来说,  第一扇区 第一块 一般会被厂家占用,这里是不能被写入数据的,每一扇区的 最后一块,也就是第四

android studio ndk-builld方式开发

之前都是在Ubuntu开发,项目也是老的,自然也就顺理成章的用eclipse做各种android的开发.最近想在android studio 切换下,有点不习惯.android studio 为ndk开发提供了两种不同的方式,使用cmake自动编译脚本 和类似eclipse上的ndk-build.这两者之间使用区别在于,如果想直接开发新的单模块可以考虑使用cmake,ide有自带辅助插件,让程序员使用起来更加舒心.如果想在第三方源码库上面做二次开发,或者需要多个源码库关联,感觉还是使用ndk-b