Android(安卓)JNI之HelloWorld
16lz
2021-01-26
Android JNI是什么,别说你不知道,不知道的自行百度或者谷歌,这里不解释。由于谷歌力推AndroidStudio,所以这里主要以AndroidStudio为主进行讲解。
1、新建Android工程
1.1 、在项目根目录中的 gradle.properties 文件中增加
android.useDeprecatedNdk=true
1.2 、打开APP module中的 build.gradle,
增加代码到defaultConfig中
defaultConfig { applicationId “***********” minSdkVersion 14 targetSdkVersion 23 versionCode 1 versionName "1.0" ndk { moduleName "hello-jni" // 生成库的名称 默认前面会加 lib ( libhello-jni.so ) }}
2、新建一个类
2.1、编写native方法
static { System.loadLibrary("hello-jni"); } public native String stringFromJNI();
2.2、新建jni目录,如下图:
屏幕快照 2016-09-08 17.59.51.png2.2、点击AndroidStudio中 build -> make project
2.3、在 app/build/intermediates/classes/debug/… 路径找到 类.class(…为包名+类名)
2.4、生成头文件
在 Terminal 窗口中执行
javah -d [output目录] -classpath ./app/build/intermediates/classes/debug/ [包+类]
-d 后面的目录是生成 文件目录(指定到新建的jni目录)
-classpath 后面的目录是编译class目录
生成的头文件内容如下:
/* DO NOT EDIT THIS FILE - it is machine generated */#include /* Header for class com_eson_hello_jni_JniUtil */#ifndef _Included_com_eson_hello_jni_JniUtil#define _Included_com_eson_hello_jni_JniUtil#ifdef __cplusplusextern "C" {#endif/* * Class: com_eson_hello_jni_JniUtil * Method: stringFromJNI * Signature: ()Ljava/lang/String; */JNIEXPORT jstring JNICALL Java_com_eson_hello_jni_JniUtil_stringFromJNI (JNIEnv *, jobject);#ifdef __cplusplus}#endif#endif
3、在生成的jni目录中编写c文件代码
3.1、在jni目录,右键->New->C/C++ Source File
3.2 、编写代码:
#include "com_eson_hello_jni_JniUtil.h"JNIEXPORT jstring JNICALL Java_com_eson_hello_jni_JniUtil_stringFromJNI (JNIEnv *env, jobject thiz) {#if defined(__arm__)#if defined(__ARM_ARCH_7A__)#if defined(__ARM_NEON__)#if defined(__ARM_PCS_VFP)#define ABI "armeabi-v7a/NEON (hard-float)"#else#define ABI "armeabi-v7a/NEON"#endif#else#if defined(__ARM_PCS_VFP)#define ABI "armeabi-v7a (hard-float)"#else#define ABI "armeabi-v7a"#endif#endif#else#define ABI "armeabi"#endif#elif defined(__i386__)#define ABI "x86"#elif defined(__x86_64__)#define ABI "x86_64"#elif defined(__mips64) /* mips64el-* toolchain defines __mips__ too */#define ABI "mips64"#elif defined(__mips__)#define ABI "mips"#elif defined(__aarch64__)#define ABI "arm64-v8a"#else#define ABI "unknown"#endif return (*env)->NewStringUTF(env, "Hello from JNI ! Compiled with ABI " ABI ".");}
这里直接拷贝的ndk-samples里面hello-jni的源码。
4、调用
public class HelloJni extends AppCompatActivity { /** * Called when the activity is first created. */ JniUtil jniUtil = new JniUtil(); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); /* Create a TextView and set its content. * the text is retrieved by calling a nativecd * function. */ TextView tv = new TextView(this); tv.setText(jniUtil.stringFromJNI()); setContentView(tv); }}
5、运行代码
运行之后会在手机屏幕显示出“Hello from JNI ! Compiled with ABI armeabi”等。
到此,我们第一个jni项目完成了。
更多相关文章
- Android(安卓)知识体系学习目录
- android 6.0 权限崩溃分析:android.system.ErrnoException: statv
- Android代码混淆与加固技术一
- Android(安卓)Studio一些使用快捷键
- Android中存储目录
- Android(安卓)studio 为项目添加启动等待界面
- android 如何快速生成jar包
- android Intent的FLAG_ACTIVITY_CLEAR_TOP和FLAG_ACTIVITY_REORD
- 利用 Android(安卓)Systrace 做performance 分析