Browsed by
作者:koffuxu

博客代码标签测试

博客代码标签测试

  1. 测试内部
    1. 序号
    2. 代码标签
  2. 开始测试
  3. jmethodID onBufJavaCallbackId;
    jmethodID onWkJavaCallbackId;
    void test (){
    	return JNI_ERR;
    
        return JNI_VERSION_1_6;
    }

AndroidStudio 3.0 NDK开发2-AAR模块封装

AndroidStudio 3.0 NDK开发2-AAR模块封装

完成了对JNI的编译,有时候是使用aar包提供给其他同学使用;或者说在共同开发的一个项目中,并不是每个人都需要开发C、C++功能。所以没必须每台电脑都配置好NDK的编译环境,所以大多数还是以AAR包的方式放在项目中。我们接下来就是完成这个事件;

JNI部分抽象成Module

第一步,file->new->new module

Read More Read More

AndroidStudio 3.0 NDK开发1——环境搭建与编译

AndroidStudio 3.0 NDK开发1——环境搭建与编译

前提

JNI开发主要有两种方式,一种是在Android源码中编译,另外一种是使用AndroidStuido工具开发。主要是看自己的业务场景。
如果你们公司是平台型开发方式,很容易或者当前就是在Android源码中做项目,推荐使用第一种方式,有Swig工具的加持也是效率很高;
如果公司是偏APP开发,得要适配不同平台,建议使用AndroidStudio工具来开发。本文讲这种方式。
使用AndroidStudio编译C/C++主要有两种方式:CMake和ndk-build
CMake:需要自己编写cmake.txt规则,使用CMake工具来编译;
ndk-build:需要自己编译Android.mk文件,使用ndk-build工具来编译。
因为Android源码是使用Android.mk来编译,所以我更习惯使用ndk-build这种方式。西方是讲这种方式。

Prepare

源码Android SDK快速迭代,JNI在AndroidStudio不同版本上使用有较大的区别,我这贴出我使用AndroidStudio相关版本的情况
OS Windows 10 10.0
NDK 17.2
JDK JRE: 1.8.0_152-release-915-b01 amd64
AndroidStudio IDE Android Studio 3.0
Build #AI-171.4408382, built on October 21, 2017
gradlewrap 版本 gradle-4.4-all.zip
AS gradle插件 com.android.tools.build:gradle:3.0.0

Starting

1,安装NDK,CMake,LLDB
2,编写并编译JAVA代码
第一步,在自己的项目中新建Java Class: MyJniTest.java
package com.aispeech.aistools.jni;

/**
 * @Author: Gangfeng Xu(gangfeng.xu@aispeech.com)
 * @Date: 9/14/2018
 */

public class MyJniTest {
    static {
        System.loadLibrary("hello-jni");
    }
    public native String getJniVersionName();

}
第二步,Ctrl + F9 make项目
第三步,在app/build目录找到这个类的class文件
第四步,生成头文件
第一种:进到debug目录,执行命令生成头文件
C:\Users\koffuxu\02-sulab\aispeech-tools\app\build\intermediates\classes\debug>javah -jni com.aispeech.aistools.jni.MyJniTest

C:\Users\koffuxu\02-sulab\aispeech-tools\app\build\intermediates\classes\debug>dir
 Volume in drive C has no label.
 Volume Serial Number is 09C1-B27D

 Directory of C:\Users\koffuxu\02-sulab\aispeech-tools\app\build\intermediates\classes\debug

09/14/2018  05:05 PM    <DIR>          .
09/14/2018  05:05 PM    <DIR>          ..
09/14/2018  04:58 PM    <DIR>          android
09/14/2018  04:58 PM    <DIR>          androidx
09/14/2018  04:58 PM    <DIR>          com
09/14/2018  05:05 PM               567 com_aispeech_aistools_jni_MyJniTest.h
               1 File(s)            567 bytes
               5 Dir(s)  173,480,382,464 bytes free
第二种方法:进入需要创建的模块main下面,其实是一样的,只是这种方法看起来更合规,并且省掉了第五步
C:\Users\koffuxu\02-sulab\aispeech-tools\usbrcvoicelib\src\main>javah -d jni -classpath C:\Users\koffuxu\02-sulab\aispeech-tools\usbrcvoicelib\build\intermediates\classes\debug com.aispeech.usbrcvoicelib.nativeutils.UsbVoiceManager
第五步,创建JNI文件夹,位于java的同级目录
第六步,把第四步生成的.h文件copy到这个文件夹,同时创建my_jni_test.c文件和Android文件
内容如下:
Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE    := hello-jni   #指定了生成的动态链接库的名字
LOCAL_SRC_FILES := my_jni_test.c #指定了C的源文件叫什么名字

include $(BUILD_SHARED_LIBRARY)  # 制定要生成动态链接库
my_jni_test.c
#include "com_aispeech_aistools_jni_MyJniTest.h"
JNIEXPORT jstring JNICALL Java_com_aispeech_aistools_jni_MyJniTest_getJniVersionName
  (JNIEnv * env, jobject obj) {
        return (*env)->NewStringUTF(env, "Hello , I'm from JNI");
  }
第七步,添加编译项目
在app下面的build.gradule添加
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    externalNativeBuild {
        ndkBuild {
            path 'src/main/jni/Android.mk'
        }
    }
或者通过IDE添加
第八步,编译完成,将看到不同平台的so文件
第九步,验证
在MainActivity.java里面调MyJniTest的方法,编译,安装验证
Log.e(TAG, "initDate: Jni version="+new MyJniTest().getJniVersionName());
打印查看

多平台支持

如果需要支持更多平台,比如Mips,需要在jni的目录添加Application.mk添加相差参数
APP_ABI := armeabi-v7a arm64-v8a
CPU 和架构 设置
ARMv5TE armeabi
ARMv7 armeabi-v7a
ARMv8 AArch64 arm64-v8a
i686 x86
x86-64 x86_64
mips32 (r1) mips
mips64 (r6) mips64
全部 all
还可以使用ndk-build命令

参考

Ubuntu环境使用Gradle编译打包APK

Ubuntu环境使用Gradle编译打包APK

参考:

1,Prepare

  • gradle:
不需要单独下载,在某个项目中执行./gradlew会下载项目需要的gradle版本,最终会下载到.gradle/dist/下面,根据ZT Android APP环境规范,下载3.3-all即可。
  • JDK:单独安装Java7
apt-get install openjdk-7-jdk
  • 安装JAVA 8
下载
scp -P 10622 jdk-8u131-linux-x64.tar.gz xugangfeng@aly.zerotech.top:~/misc/
  • android-sdk:
新的sdk都是打包在android studio工具里面,但我们又不需要。我们可以先通过下载一个老的版本sdk,然后通过这个sdk里面的工具android命令下载新的sdk版本和build tools。
 tar xf android-sdk_r24.4.1-linux.tgz
完成之后,就可以使用android命令了
列出远程可以下载的sdk和tools版本
android list sdk –all
  1. 9- Android SDK Build-tools, revision 24.0.2
  2. 10- Android SDK Build-tools, revision 24.0.1
  3. ...
  4. 37- SDK Platform Android 7.0, API 24, revision 2
  5. 38- SDK Platform Android 6.0, API 23, revision 3
  6. 39- SDK Platform Android 5.1.1, API 22, revision 2
  7. 40- SDK Platform Android 5.0.1, API 21, revision 2
下载对应平台的,我下载build-tools 24.0.2和 sdk版本为22.
android update sdk -a -u -t 1,2,6,7,36,42,37
  • 更新环境变量
  1. #android sdk
  2. ANDROID_HOME=/home/andbase/workspace/misc/android-sdk-linux
  3. export ANDROID_HOME
  4. GRADLE_HOME=/home/andbase/.gradle/wrapper/dists/gradle-3.3-all/55gk2rcmfc6p2dg9u9ohc3hw9/gradle-3.3/
  5. export PATH=$PATH:$ANDROID_HOME/tools:$ANDROID_HOME/tools/bin:$GRADLE_HOME/bin

2,Ready Go

  • 进入项目目录,Gradle版本确认,确认gradle版本为3.3
  1. andbase@vm-10-142-132-78:ZerotechDemo$ ./gradlew -v
  2. ------------------------------------------------------------
  3. Gradle 3.3
  4. ------------------------------------------------------------
  5. Build time: 2017-01-03 15:31:04 UTC
  6. Revision: 075893a3d0798c0c1f322899b41ceca82e4e134b
  7. Groovy: 2.4.7
  8. Ant: Apache Ant(TM) version 1.9.6 compiled on June 29 2015
  9. JVM: 1.7.0_85 (Oracle Corporation 24.85-b03)
  10. OS: Linux 3.16.0-30-generic amd64
  • 配置好java
根据sdk版本,选择java, update-alternatives –config java/javac
  • 设置Liecense
如果不设置,否则会有这样的错误
  1. * What went wrong:
  2. A problem occurred configuring project ':app'.
  3. > You have not accepted the license agreements of the following SDK components:
  4. [Android SDK Platform-Tools].
  5. Before building your project, you need to accept the license agreements and complete the installation of the missing components using the Android Studio SDK Manager.
  6. Alternatively, to learn how to transfer the license agreements from one workstation to another, go to http://d.android.com/r/studio-ui/export-licenses.html
android list sdk –all   列出当前的platform-tools
2- Android SDK Platform-tools, revision 26
android update sdk -a -u -t 1,2
November 20, 2015
Do you accept the license ‘android-sdk-license-c81a61d9′ [y/n]: y
另外,外部依赖包constraint-layout需要使用sdkmanager命令来添加License确认
sdkmanager “extras;m2repository;com;android;support;constraint;constraint-layout-solver;1.0.2″
  • lint检查错误

在编译脚本文件app/build.gradle中的android切点添加参数

    lintOptions {
        abortOnError false
    }
同时也可以使用assembleDebug的task,忽略Lint的检查
  • 开始编译
不进行Lint检查:
gradle –daemon  assembleDebug

3,TroubleShooting

TBD
TOP