博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
android JNI调用(Android Studio 3.0.1)(转)
阅读量:6250 次
发布时间:2019-06-22

本文共 2793 字,大约阅读时间需要 9 分钟。

最近回头复习了一下android 的jni调用,却发现按以前的方法调用失败,一怒之下就重新摸索,碰了几次壁,发现网上好多教程都不能成功调用,于是记录一下现在AS版本成功好用的调用方法。

这里设定你的ndk已经下载并且设置没问题.源码链接:http://download.csdn.net/download/yeyuehei/10149844

当前android studio 版本3.0.1,步骤如下:

1.设置jni -h 和ndk -build的快捷方式

2.java代码写c回调的方法,及grade的配置

3.快捷键jni -h生成头文件.h

4.建立c资源文件和mk文件及c函数的调用

5.快捷键ndk-build生成三种.so库文件

以上是步骤,具体如下:

1.置jni -h 和ndk -build的快捷方式

新建项目,成功后点击File,然后找到Settings...点击找到External Tools,然后如下图添加java -jni快捷键

Tool settings中三行可以直接copy上去:

$JDKPath$\bin\javah.exe
-classpath . -jni -d $ModuleFileDir$/src/main/jni $FileClass$
$ModuleFileDir$\src\main\java

 

添加ndk-build快捷键如下图:

Tool settings 的两行:

F:\software\androidstudio\sdk\ndk-bundle\ndk-build.cmd(根据自己的ndk目录设置这个路径)

$ModuleFileDir$\src\main(直接copy)

 

添加成功后随便右键点击一个文件找到External Tools就会发现刚才添加的快捷键

 

2.java代码写c回调的方法,及grade的配置

新建一个class 名称随便,这里是JniKet,如下

 

打开build.gradle 添加ndk和 sourceSets如下图

注意:

1.ndk中的moduleName要和上图中的libName一致

2.sourceSets中的两行都要加上缺一不可

3.图中红框的代码会在图下面出现。。。

 

ndk {    moduleName "JniDemo"    abiFilters "armeabi", "armeabi-v7a", "x86"//cpu的类型}sourceSets {    main {        jniLibs.srcDirs  'src/main/libs        jni.srcDirs = []    }}

 

以上配置就够了,其他都不需要

 

3.快捷键jni -h生成头文件.h,建立c资源文件和mk文件及c函数的调用

选中刚才建的class(这里是JniKet),右键找到External Tools,选中jni -h,然后会在main下成jni文件夹,里面包含生成的头文件,名称格式:包名+类名.h

打开.h文件如下图:

 

右键->new->c/c++ source file->type选.c(名称随便,这里是TestJni),然后copy上图红框中的两个函数到新建的.c文件

为了验证 能调用c方法,再建立一个c方法的头文件和资源文件(同一个文件夹下):

test.h:

 

#include 
#include
int addValue(int x, int y);

test.c

#include "test.h"int addValue(int x, int y){return x*10+y*10;}

 

 

最后将test.c引入刚才建立的jni资源文件中(这里是TestJni))最后TestJni如下:

 

#include  "lifaair_edifier_com_myjni_JniKet.h"#include "test.c"JNIEXPORT jstring JNICALL Java_lifaair_edifier_com_myjni_JniKet_testJni  (JNIEnv *env, jclass jc){     return (*env)->NewStringUTF(env,"fuck your father,langfei laozi's time");  }JNIEXPORT jint JNICALL Java_lifaair_edifier_com_myjni_JniKet_getValue    (JNIEnv *env, jclass js ){    return addValue(10, 8);  }

 

 

当然别忘了mk文件两个:

名称:Android.mk

内容:

 

LOCAL_PATH := $(call my-dir)  include $(CLEAR_VARS)    LOCAL_MODULE := JniDemoLOCAL_C_INCLUDES := lifaair_edifier_com_myjni_JniKet.hLOCAL_SRC_FILES := TestJni.c  LOCAL_LDLIBS := -llog    include $(BUILD_SHARED_LIBRARY)

 

 

名称:Application.mk

内容:

APP_ABI := armeabi armeabi-v7a x86

 

 

5.快捷键ndk-build生成三种.so库文件

右键点击Jniket(步骤2中生成的 java class),右键找到External Tools,选中ndk-build,就会生成三种.so文件如下图:

 

当然还有最重要的调用:

 

public class MainActivity extends AppCompatActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        TextView tv_hello = findViewById(R.id.tv_hello);        tv_hello.setText("this message from jni,its value is:\n"+JniKet.testJni()+"\n getValue():"+JniKet.getValue());     }}

编译运行,成功运行如下图:

 

 

转自:

你可能感兴趣的文章
pandas入门指南
查看>>
数值的整数次方
查看>>
[20180105]oracle临时表补充.txt
查看>>
单体架构风格
查看>>
区块链主链——2018年公链发展元年
查看>>
美国专家:人工智能凛冬将至
查看>>
字符串 模式匹配
查看>>
吴恩达《深度学习》第二门课(2)优化算法
查看>>
(转)为什么选择机器学习策略
查看>>
python中的计时模块:time.time()
查看>>
阿里云出征CES:来AWS大本营展现全球布局
查看>>
Go 语言 Excel 类库 Excelize 2.0.0 版本发布
查看>>
开源中国 iOS 4.6.0 发布!软件页大改版,灰名单功能上线
查看>>
Redkale 2.0.0.alpha1 发布,Java 分布式微服务框架
查看>>
区块链凉了?我们来看一些真问题
查看>>
美国Gazelle秒杀国内二手交易网站,是如何赢的?
查看>>
敲黑板!原子变量与内存模型是什么鬼!
查看>>
Adobe将机器学习融入邮件营销平台,满足客户个性化需求
查看>>
Waymo称已拿到关键性证据,案件审讯或推迟
查看>>
比特人生|信仰下的欲望、疯狂与迷惘
查看>>