androidstudioc++代码提⽰,androidstudioNDK开发,简单调⽤
C、C++
前⾔
之前⼀直都是使⽤别⼈写好的so⽂件,没有亲⾃去写过,于是决定研究⼀番。先说说NDK是什么呢?NDK其实就是⼀系列⼯具的集合。NDK有什么⽤呢?(1) NDK的发布,使“Java+C”的开发⽅式终于转正,成为官⽅⽀持的开发⽅式。(2)NDK将是Android平台⽀持C开发的开端。
环境配置
1. 在android studio中的setting-->Android SDK-->SDK Tools选项卡,下载NDK,CMake,LLDB三个⼯具
QQ截图20170402094234.png
2. 新建⼀个项⽬,并勾选Include C++ support,⼀路next下去。
QQ截图20170401171350.png
简易安卓app开发3. 配置android studio中ndk路径。如果ndk路径没有⾃动添加,则点击select即可。并在local.properties配置⽂件中检查是否正确配置路径。
QQ截图20170402095009.png
QQ截图20170402095059.png
4. 配置ndk系统环境变量,并在配置完成后检查配置是否成功
QQ截图20170402095327.png
QQ截图20170402095432.png
dos下命令:ndk-build;出现以下信息说明配置成功
QQ截图20170402095704.png
5. 设置as。将ndk版本差异检测过滤掉,要不然项⽬⽆法编译。添加:android.useDeprecatedNdk=true
QQ截图20170402095914.png
6. 编写调⽤c的java代码。注意:这⾥如果⽅法名报错,不⽤管他。同时把MainActivity⾥的 static {System.loadLibrary("native-lib"); }剪切复制到新建的MathKit类中
public class MathKit {
public static native int square(int num);
// Used to load the 'native-lib' library on application startup.
static {
System.loadLibrary("native-lib");
}
}
7. ⽣成调⽤本地⽅法的.h头⽂件。⽤as⾃带的Terminal⼯具来⽣成。
命令:
进⼊你项⽬的java⽂件夹下
cd app/src/main/java
com.axaet.ndk是你的完整包名,后⾯跟具体写有调⽤c代码的java类
javah -jni com.axaet.ndk.MathKit
QQ截图20170402101250.png
QQ截图20170402101337.png
8. ⽣成jni⽂件夹。⽤于存放.h和.c⽂件,把步骤7⽣成的.h头⽂件剪切到jni⽂件夹⾥,并创建对应的.c⽂件
QQ截图20170402101858.png
QQ截图20170402101747.png
9. 写c的测试代码。include中指向你创建的.h头⽂件 Java_com_axaet_ndk_MathKit_square;Java_包名类名⽅法名(参数)** #include "com_axaet_ndk_MathKit.h"
//注意⽅法名要和.h⽂件⾥的⼀样
JNIEXPORT jint JNICALL Java_com_axaet_ndk_MathKit_square(JNIEnv *env, jclass cls, jint num) {
return num * num;
}
10.在adle中配置⽣成so⽂件的信息,主要配置abiFilters
android {
compileSdkVersion 25
buildToolsVersion "25.0.2"
defaultConfig {
applicationId "com.axaet.ndk"
minSdkVersion 15
targetSdkVersion 25
versionCode 1
versionName "1.0"
testInstrumentationRunner "st.runner.AndroidJUnitRunner"
externalNativeBuild {
cmake {
cppFlags ""
abiFilters "armeabi-v7a", "armeabi", "x86"
}
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile(''), 'proguard-rules.pro'
}
}
externalNativeBuild {
cmake {
path ""
}
}
}
由于android studio 2.2以上使⽤CMake,所以需要配置⽂件,修改⽣成后so⽂件名称、添加.c⽂件的路径
QQ截图20170402102921.png
11. ⽤Make Project ⽣成so⽂件,然后运⾏项⽬。然后就可以拿到so⽂件
QQ截图20170402103505.png
12. 测试本地c代码的调⽤。
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
setContentView(R.layout.activity_main);
// Example of a call to a native method
TextView tv = (TextView) findViewById(R.id.sample_text);
//必须先加载so⽂件,加载so⽂件在MathKit类中
tv.setText(String.valueOf(MathKit.square(12)).concat(" ").concat(stringFromJNI()));
}
/**
* A native method that is implemented by the 'native-lib' native library,
* which is packaged with this application.
*/
public native String stringFromJNI();
}
下⾯是打包jar
13. 删除⼀些⽆⽤的资源,如MainActivity,layout等,只留下和JNI有关的java类
QQ截图20170405154544.png
14. 修改module的adle⽂件
有如下⼏个地⽅需要修改:
将最前⾯的apply plugin: 'com.android.application'修改为apply plugin: 'com.android.library'将defaultConfig修改为:
defaultConfig {
minSdkVersion 14
targetSdkVersion 23
}
SDK的版本可以根据⾃⼰的版本来改
在最后加上
task deleteOldJar(type: Delete) {
delete 'build/outputs/test.jar'
}
task exportJar(type: Copy) {
from('build/intermediates/bundles/release/')
into('build/libs/')
include('classes.jar')
rename ('classes.jar', 'test.jar')
}
exportJar.dependsOn(deleteOldJar, build)
15.导出jar包
⾸先打开Gradle
打开app->Tasks->other->exportJar
然后双击exportJar就可以了,然后再'build/intermediates/bundles/release/'路径就可以到classes.jar 当然混淆可以⾃⼰视情况添加。
项⽬源码
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论