安卓JNI--Android studio 1.5 JNI开发初探
2015-12-03 14:25
661 查看
我的博客:http://blog.csdn.net/muyang_ren
Google的github示例代码 :https://github.com/googlesamples/android-ndk
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
(2)修改gradle/gradle-wrapper.properties中的版本修改为2.8
(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
改成
【windows 10 使用备注】
1、NDK目录路径不得大于三层
2、c盘的权限高,请放置其他盘
错误笔记
错误1
Error:Cause: org.gradle.api.internal.ExtensibleDynamicObject
错误2
Error:Unable to load class ‘com.android.build.gradle.managed.ProductFlavor_Impl’.
Possible causes for this unexpected error include:
应改成
错误3
Error:No signature of method: org.gradle.model.ModelMap.getDefaultProguardFile() is applicable for argument types: (java.lang.String) values: [proguard-android.txt]
改成
2、库文件申明(test-jni是库名也是c文件名,生成的JNI文件名libtest-jni.so)
1)在app/build.gradle下的android.ndk 内添加 moduleName = “test-jni”
2)在所需的activity下加载所需的JNI库
3)在所需的activity下声明一个native方法
声明的native函数应该是红色报错的,坐标落在函数上,按ALT+Enter,选中
,会自动在jni文件夹下新建test-jni.c
,并创建hellojni方法:Java_com_example_lianghuiyong_myapplication_MainActivity_hellojni,前面一长串是包名+类名+方法名。
test-jni.c
编译后可生成这些平台使用的库文件
2、JNI中加头文件
JNI具体讲解可参见:http://blog.csdn.net/innost/article/details/47204557
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.gradleandroid.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
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题