安卓JNI--Android studio 1.5 JNI开发初探

我的博客:http://blog.csdn.net/muyang_ren

Google的github示例代码 :https://github.com/googlesamples/android-ndk

一、配置JNI开发环境

软件环境
JAVA JDK: jdk1.8.0_60
Android studio版本:1.5
注:Android Studio 1.3版本以上才支持gradle构建JNI

1、使用Android Studio下载NDK
这里写图片描述
2、修改gradle

默认情况下(2)是不用改的
(1)修改gradle目录下的build.gradle

classpath 'com.android.tools.build:gradle-experimental:0.4.0'
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        //classpath 'com.android.tools.build:gradle:1.5.0'
        classpath 'com.android.tools.build:gradle-experimental:0.4.0'
    }
}
allprojects {
    repositories {
        jcenter()
    }
}
task clean(type: Delete) {
    delete rootProject.buildDir
}

(2)修改gradle/gradle-wrapper.properties中的版本修改为2.8

distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
#Wed Oct 21 11:34:03 PDT 2015
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip

(3)修改app/build.gradle(大改动)

1、apply plugin: ‘com.android.application’ 改成 apply plugin: ‘com.android.model.application’
2、语法结构
1) android语句由model包裹。
2)原来在android里面的buildTypes转在model属性下
3)dependencies属性依然独立在外
3、 各项配置都是有等号“ = ”赋值的

没改时的build.gradle

apply plugin: 'com.android.application'
android {
    compileSdkVersion 23
    buildToolsVersion "23.0.2"
    defaultConfig {
        applicationId "com.example.lianghuiyong.test"
        minSdkVersion 15
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}
dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.1.1'
}

改成

apply plugin: 'com.android.model.application'
model{
    android {
        compileSdkVersion = 23
        buildToolsVersion = "23.0.2"
        defaultConfig.with {
            applicationId = "com.example.lianghuiyong.myjni"
            minSdkVersion.apiLevel = 15
            targetSdkVersion.apiLevel = 23
            versionCode = 1
            versionName = "1.0"
        }
    }
    android.buildTypes {
        release {
            minifyEnabled = false
            //proguardFiles  getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            proguardFiles.add(file('proguard-rules.txt'))
        }
    }
    android.ndk {
       // moduleName = "hello-jni"
        CFlags.add("-std=c99")
        ldLibs.addAll(["android","OpenSLES", "log"]) //加Log支持
    }
}
dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.1.1'
}

【windows 10 使用备注】

1、NDK目录路径不得大于三层
2、c盘的权限高,请放置其他盘

ndk.dir=D\:\\Android\\sdk\\ndk-bundle
sdk.dir=D\:\\Android\\sdk

错误笔记

错误1
Error:Cause: org.gradle.api.internal.ExtensibleDynamicObject

./app/build.gradle文件修改时请注意赋值要带等号“ =

错误2
Error:Unable to load class ‘com.android.build.gradle.managed.ProductFlavor_Impl’.
Possible causes for this unexpected error include:

        defaultConfig{
            applicationId = "com.example.lianghuiyong.myjni"
            minSdkVersion = 15
            targetSdkVersion = 23
            versionCode = 1
            versionName = "1.0"
        }

应改成

        defaultConfig.with {
            applicationId = "com.example.lianghuiyong.myjni"
            minSdkVersion.apiLevel = 15
            targetSdkVersion.apiLevel = 23
            versionCode = 1
            versionName = "1.0"
        }

错误3
Error:No signature of method: org.gradle.model.ModelMap.getDefaultProguardFile() is applicable for argument types: (java.lang.String) values: [proguard-android.txt]

proguardFiles  getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

改成

proguardFiles.add(file('proguard-rules.txt'))

二、编写JNI

1、新建JNI目录
这里写图片描述

2、库文件申明(test-jni是库名也是c文件名,生成的JNI文件名libtest-jni.so)

1)在app/build.gradle下的android.ndk 内添加 moduleName = “test-jni”

    android.ndk {
        ......
        moduleName = "test-jni"
        ......
    }

2)在所需的activity下加载所需的JNI库

public class MainActivity extends AppCompatActivity {
    ......
    static {
        System.loadLibrary("test-jni");
    }
    ......
}

3)在所需的activity下声明一个native方法

public class MainActivity extends AppCompatActivity {
    ......
    public native String hellojni();
    ......
}

声明的native函数应该是红色报错的,坐标落在函数上,按ALT+Enter,选中这里写图片描述,会自动在jni文件夹下新建test-jni.c这里写图片描述,并创建hellojni方法:Java_com_example_lianghuiyong_myapplication_MainActivity_hellojni,前面一长串是包名+类名+方法名。

test-jni.c

#include <jni.h>
JNIEXPORT jstring JNICALL
Java_com_example_lianghuiyong_myapplication_MainActivity_hellojni(JNIEnv *env, jobject instance) {
    // TODO
    //hellojni();返回“hello jni”字符串
    return (*env)->NewStringUTF(env, "hello jni");
}

编译后可生成这些平台使用的库文件
这里写图片描述

JNI 打印Log

1、修改app/build.gradle

    android.ndk{
        moduleName = "timecount-jni"
        CFlags.add("-std=c99")
        ldLibs.addAll(["android","OpenSLES", "log"]) //加Log支持
    }

2、JNI中加头文件

#include <android/log.h>

//使用实例
#define TAG "lhy"
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,TAG ,__VA_ARGS__)

LOGD("JNI:h = %d; m = %d; s = %d;",h,m,s);

JNI具体讲解可参见:http://blog.csdn.net/innost/article/details/47204557

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值