Android Studio 使用JNI笔记

主要记录一些as使用JNI的一些配置,避免忘记每次都要到处查找。。。
使用as开发可以不用创建Android.mk文件,Application.mk文件,只要在build.gradle文件中配置相应的参数即可使用。。

1.JNI文件的创建

首先创建Java的native类


public classMyJniTest {

public native voidprint(String str);

public native String getName();

}

然后运行项目,运行完成后在项目的build/intermediates/classes/debug/目录下面可以看到生成的MyJniTest.class文件,然后用java命令生成对应的JNI的.h文件,命令如下:


bogon:asjnitest yjg$ cd build/intermediates/classes/debug/
bogon:debug yjg$ ls
android com
bogon:debug yjg$ javah -jni com.jni.yjg.asjnitest.MyJniTest

创建完成后就可以看到对应的.h文件,在../debug/下面

B712C089-290A-4CFA-AD97-391F9A3F695C.png

具体代码如下:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_jni_yjg_asjnitest_MyJniTest */

#ifndef _Included_com_jni_yjg_asjnitest_MyJniTest
#define _Included_com_jni_yjg_asjnitest_MyJniTest
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_jni_yjg_asjnitest_MyJniTest
 * Method:    print
 * Signature: (Ljava/lang/String;)V
 */
JNIEXPORT void JNICALL Java_com_jni_yjg_asjnitest_MyJniTest_print
  (JNIEnv *, jobject, jstring);

/*
 * Class:     getName
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_jni_yjg_asjnitest_MyJniTest_getName
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

2.JNI配置

在项目的build.gradle文件中配置jni的参数了

debug{   
       ndk{        
            moduleName "MyJniTest"//生成的so名字        
            stl "stlport_static"        
            ldLibs "log"   //实现__android_log_print    
            abiFilters "armeabi", "armeabi-v7a", "x86"  //输出指定三种  abi体系结构下的so库。    
      }
}

其中stl就相当于Android.mk文件中的APP_STL属性。大概就是导入C++运行时库吧。。
abiFilters就相当.mk文件中的APP_ABI。用于生成不同架构的.so包。

3.实现jni方法
拷贝.h文件到项目的jni目录下面。(as的jni目录默认在main下面,需要自己创建,当然也可以在build.gradle中自己指定)
创建对应的.cpp文件
然后就是实现.h文件中的方法,.cpp文件的具体代码

#include <jni.h>
#include <com_jni_yjg_asjnitest_MyJniTest.h>
#include <android/log.h>


JNIEXPORT void JNICALL Java_com_jni_yjg_asjnitest_MyJniTest_print
(JNIEnv * env, jobject obj, jstring jsstr){   
 __android_log_print(ANDROID_LOG_DEBUG,"android","hello  jni");
}

 JNIEXPORT jstring JNICALL Java_com_jni_yjg_asjnitest_MyJniTest_getName
        (JNIEnv * env, jobject jobject1){
    return env->NewStringUTF("I'm jni");

}

ok以上就是JNI部分的实现了。
然后就是java层调用jni了,先是加载jni库:

static {   
 System.loadLibrary("MyJniTest");
}

接着就是调用jni的方法了:

MyJniTest test=new MyJniTest();
test.print("aaa");
System.out.println("name:"+test.getName());

OK 运行项目。。

这个就是Logcal中打印出来日志:

07-17 16:52:47.208 2211-2211/com.jni.yjg.asjnitest D/android: hello  jni
07-17 16:52:47.208 2211-2211/com.jni.yjg.asjnitest I/System.out: name:I'm jni

OK,这就说明java层通过JNI和C++交互成功了。
补充说明:
__android_log_print(ANDROID_LOG_DEBUG,"android","hello jni")这个是jni的log也能在Logcat中显示,可以用来调试C++代码,使用方法也和android的log类似,比如:ANDROID_LOG_DEBUG对应就是Log.d
可以简单的封装下:

#ifndef MY_APPLICATION_EBEN_HPC_LOG_H
#define MY_APPLICATION_EBEN_HPC_LOG_H
#ifdef __cplusplus
extern "C" {
#endif
#include <android/log.h>
// 宏定义类似java 层的定义,不同级别的Log LOGI, LOGD, LOGW, LOGE, LOGF。 对就Java中的 Log.i log.d
#define LOG_TAG    "JNILOG" // 这个是自定义的LOG的标识
//#undef LOG // 取消默认的LOG
#define LOGI(...)  __android_log_print(ANDROID_LOG_INFO,LOG_TAG, __VA_ARGS__)
#define LOGD(...)  __android_log_print(ANDROID_LOG_DEBUG,LOG_TAG, __VA_ARGS__)
#define LOGW(...)  __android_log_print(ANDROID_LOG_WARN,LOG_TAG, __VA_ARGS__)
#define LOGE(...)  __android_log_print(ANDROID_LOG_ERROR,LOG_TAG, __VA_ARGS__)
#define LOGF(...)  __android_log_print(ANDROID_LOG_FATAL,LOG_TAG, __VA_ARGS__)

#ifdef __cplusplus
}
#endif

这样子使用的时候直接调用:

LOGD("log.d 这是Jni中的log: xxxxxxx");

这就和android中的log方法差不多了。。

👌打完收工~~~~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,444评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,421评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,363评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,460评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,502评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,511评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,280评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,736评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,014评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,190评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,848评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,531评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,159评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,411评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,067评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,078评论 2 352

推荐阅读更多精彩内容