分类: Android Studio
Android Studio 1.2 开发JNI工程
-
添加native接口
注意写好native接口和System.loadLibrary()即可了,并无特别之处。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
public class MainActivity extends Activity{ static { System.loadLibrary("JniTest"); } public native String getStringFromNative(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TextView txtView = (TextView) findViewById(R.id.txt); txtView.setText(getStringFromNative()); } } |
-
执行Build->Make Project
这一步骤执行一下,验证工程中并无其它错误,并对工程进行了编译,生成了.class文件.
.class文件的生成路径是在 app_path/build/intermediates/classes/debug下的.如下图:
-
javah生成c头文件
点击"View->Tool Windows->Terminal",即在Studio中进行终端命令行工具.执行如下命令生成c语言头文件。
这里需要注意的是要进入 \app\src\main的目录下执行javah命令,为的是生成的 .h 文件同样是在\app\src\main路径下,可以在Studio的工程结构中直接看到。
1 2 3 4 |
$ cd app/src/main $ javah -d jni -classpath %Android_SDK_Home%\platforms \android-21\android.jar;..\..\build\intermediates\classes\debug lab.sodino.jnitest.MainActivity |
-
编辑c文件
在main.c文件中实现头文件中的方法,具体功能为直接return回一个String,并且使用android_log打印出相关日志。
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
/* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> #include <android/log.h> #ifndef LOG_TAG #define LOG_TAG "ANDROID_LAB" #define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__) #endif /* Header for class lab_sodino_jnitest_MainActivity */ #ifndef _Included_lab_sodino_jnitest_MainActivity #define _Included_lab_sodino_jnitest_MainActivity #ifdef __cplusplus extern "C" { #endif /* * Class: lab_sodino_jnitest_MainActivity * Method: getStringFromNative * Signature: ()Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_lab_sodino_jnitest_MainActivity_getStringFromNative (JNIEnv * env, jobject jObj){ LOGE("log string from ndk."); return (*env)->NewStringUTF(env,"Hello From JNI!"); } #ifdef __cplusplus } #endif #endif |
-
配置NDK
-
Jni目录下手工创建Application.mk
里面内容如下:
1 |
APP_PLATFORM := android-21 |
-
Jni目录下手工创建Android.mk
1 2 3 4 5 6 7 8 9 10 |
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE:= JniTest LOCAL_LDLIBS+= -L$(SYSROOT)/usr/lib -llog LOCAL_SRC_FILES := main.c include $(BUILD_SHARED_LIBRARY) |
再执行"Build->Rebuild Project",就可以编译出so文件了.
如果
跟我的代码布局类似,增加了一个include目录,里面包含引用的第三方头文件,那么就比较折腾,因为编译的时候会报告找不到头文件,而通过设置
1 |
LOCAL_C_INCLUDES += $(LOCAL_PATH)/include/ |
是可以通过命令行编译通过的,但是却不能在Gradle中编译通过。
这种情况下,需要放弃Android Studio 自带的配置,修改app目录下的“build.gradle”
原始内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
apply plugin: 'com.android.application' android { compileSdkVersion 22 buildToolsVersion "22.0.1" defaultConfig { applicationId "mobibrw.longsky.com.sctpclient" minSdkVersion 21 targetSdkVersion 22 versionCode 1 versionName "1.0" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) } |
修改后的内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
import org.apache.tools.ant.taskdefs.condition.Os apply plugin: 'com.android.application' android { compileSdkVersion 22 buildToolsVersion "22.0.1" defaultConfig { applicationId "mobibrw.longsky.com.sctpclient" minSdkVersion 21 targetSdkVersion 22 versionCode 1 versionName "1.0" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } sourceSets.main { jni.srcDirs = [] jniLibs.srcDir './src/main/libs' } task ndkBuild(type:Exec) { def Properties localProps = new Properties() localProps.load(new FileInputStream("local.properties")) def ndk_dir = localProps['ndk.dir'] def ndk_build_cmd = "$ndk_dir/ndk-build" if (Os.isFamily(Os.FAMILY_WINDOWS)) { ndk_build_cmd = "$ndk_dir/ndk-build.cmd" } commandLine ndk_build_cmd, '-j', Runtime.runtime.availableProcessors(),"NDK_OUT=$buildDir/native/obj","NDK_PROJECT_PATH=./src/main" } tasks.withType(JavaCompile) { compileTask->compileTask.dependsOn ndkBuild } } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) } |
参考 http://blog.csdn.net/sodino/article/details/41946607
Android Studio *.jar 与 *.aar 的生成与*.aar导入项目方法
Android Studio的一个好处在于Android函数库包格式“aar”格式。以前,Android函数库通常需要被导入到IDE以此将App需要的资源加入编译。但是现在的Android函数库可以被直接包含,与“jar”文件被Java项目包含的方式类似。这项功能虽然出现已久,但确实非常受欢迎。
-
Android Studio新建一个Library
1.点击“New Module”
3.根据向导一步一步继续下去就可以了。
-
简单介绍
在Android Studio中对一个自己库进行生成操作时将会同时生成*.jar与*.aar文件。
分别存储位置:
*.jar:库 /build/intermediates/bundles/debug(release)/classes.jar
*.aar:库 /build/outputs/aar/libraryname.aar
两者区别:
*.jar: 只包含了class文件与清单文件 ,不包含资源文件,如图片等所有res中的文件。
*.aar: 包含所有资源 ,class以及res资源文件全部包含
如果你只是一个简单的类库那么使用生成的*.jar文件即可;如果你的是一个UI库,包含一些自己写的控件布局文件以及字体等资源文件那么就只能使用*.aar文件。
使用方式:
*.jar:拷贝到:libs目录,eclipse直接导入即可,AndroidStudio项目中添加:
1 2 3 |
dependencies { compile fileTree(include: ['*.jar'], dir: 'libs') } |
重新编译一次项目既可完成加载。
*.aar:有两种方式,分别为本地加载以及网络加载,由于网络加载涉及到发布到mavenCentral托管的问题这里不做讨论;另外eclipse很久没有使用了也不做讨论;在这里给大家说一种本地加载的方式,简单快捷。
这里演示的aar文件为: “genius.aar”
第一步:拷贝到:libs目录
第二步:build.gradle 配置文件中更改为
1 2 3 4 5 6 7 8 |
repositories { flatDir { dirs 'libs' } } dependencies { compile(name:'genius', ext:'aar') } |
分别添加了 “repositories” 与更改了 “dependencies” ,然后重新编译一次项目就可以正常使用了。
这时打开你的项目地址 “\build\intermediates\exploded-aar\” 你会发现下面多了一个文件夹 “genius”打开后能看见里边包含了一个 “classes.jar” 文件与一些 资源文件和“R.txt”文件 。
这就是Android Studio自动解析了aar文件后出现的东西。
对于比较常见的项目配置,有如下的参考,可以看到带版本号的情况,使用的aar跟jar文件还是有差别的,aar文件,最后要增加一个“@aar”的标记。
1 2 3 4 5 6 7 |
dependencies { androidTestCompile 'junit:junit:4.+' compile fileTree(dir: 'libs', include: '*.jar') compile 'com.github.flavienlaurent.datetimepicker:library:0.0.2' compile 'de.keyboardsurfer.android.widget:crouton:1.8.4@aar' compile 'com.google.android.apps.dashclock:dashclock-api:2.0.0' } |
参考链接
Android Studio增加assets目录
用Android Studio建立的项目,默认没有 assets目录,需要手动引入。
创建的方法如下图所示。
Android Studio如何Import Module 即项目依赖(针对非Gradle项目,以Crosswalk为例)
我们要写一个使用CrosswalkWebView的项目,就要依赖Crosswalk的工程,在Eclipse中存在Workspace的概念,对应到Android Studio 就变成了Module.
我们下载到的Crosswalk-WebView的工程是Eclipse建立的项目,此时项目是不能被Android Studio直接引用的,因此需要导入成Android Studio项目的一个Module。
-
导入Module
1.选择"Import Module"菜单
2.选择项目的路径,并且重命名 Module Name
3.完成导入
4.查看导入完成后的项目中,出现了新导入的 "CrosswalkWebview",实质上是拷贝了所需要的文件到工程的目录中
-
设置Module之间项目依赖
Android Studio中创建keystore
一直在Eclipse中开发Android
,切换到Android Studio
中之后,各种不习惯。基本的创建keystore
文件的操作也是找了半天才找到。
1.点击Build ,在下拉框中选择 "Generate Signed APK"
2.选择 "Create new"
3.按照里面的内容填写即可,注意最后文件的扩展名变为".jks",而不是以前的".keystore".
注意:最新的Android Studio 4.x
版本已经没办法按照上面的办法创建证书了,创建证书会报告如下错误:
解决方法是在Android Studio
的命令行中执行证书创建命令,创建pkcs12
格式的证书,如下:
1 |
$ keytool -deststoretype pkcs12 -genkeypair -alias ka -keystore ks.p12 -keyalg RSA |
参考下图:
根据提示,补充内容即可。
Android Studio
中使用证书:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
signingConfigs { release { File strFile = new File("ks.p12") storeFile file(strFile) keyAlias 'ka' keyPassword 'password' storePassword 'password' } debug { File strFile = new File("ks.p12") storeFile file(strFile) keyAlias 'ka' keyPassword 'password' storePassword 'password' } } buildTypes { release { signingConfig signingConfigs.release minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } debug { signingConfig signingConfigs.debug } } |