最近回头复习了一下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 <string.h>

#include <jni.h>

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 := JniDemo
LOCAL_C_INCLUDES := lifaair_edifier_com_myjni_JniKet.h
LOCAL_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()); } }

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

转自:https://blog.csdn.net/yeyuehei/article/details/78741753

android JNI调用(Android Studio 3.0.1)(转)的更多相关文章

  1. android JNI调用机制

    JNI的出现使得开发者既可以利用Java语言跨平台.类库丰 富.开发便捷等特点,又可以利用Native语言的高效. JNI是JVM实现中的一部分,因此Native语言和Java代码都运行在JVM的宿主 ...

  2. Cocos2d-x3.3RC0通过JNI调用Android的Java层URI代码发送短信

    1.Jni不在赘述.翻看前面博客 2.直接上代码 1)Java层,直接加在AppActivity.java中 public class AppActivity extends Cocos2dxActi ...

  3. android JNI调用(转)

    Android jni开发资料--NDK环境搭建 android开发人员注意了 谷歌改良了ndk的开发流程,对于Windows环境下NDK的开发,如果使用的NDK是r7之前的版本,必须要安装Cygwi ...

  4. Android Jni调用浅述

    声明:欢迎转载,转载时请注明出处!http://blog.csdn.net/flydream0/article/details/7371692 1 简述 JNI是Java Native Interfa ...

  5. Android Jni 调用

    Chap1:JNI完全手册... 3 Chap2:JNI-百度百科... 11 Chap 3:javah命令帮助信息... 16 Chap 4:用javah产生一个.h文件... 17 Chap5:j ...

  6. Android JNI的Android.mk文件语法详解

    Android.mk简介: Android.mk文件用来告知NDK Build 系统关于Source的信息. Android.mk将是GNU Makefile的一部分,且将被Build System解 ...

  7. android JNI 调用NDK方法

    @import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/c ...

  8. android JNI调用 execlp函数

    execlp()函数           execlp函数简单的来说就是C语言中执行系统命令的函数          execlp()会从PATH 环境变量所指的目录中查找符合参数file 的文件名, ...

  9. Ubuntu系统下实现Android工程调用独立编译的C++程序和GMP、PBC库

    目的: 实现使用C++编写代码供Android工程调用.C++代码中可以使用STL库,也可以使用常用的由源码编译生成的库,如PBC.因为PBC是基于GMP库的,所以这里只记录了GMP和PBC库的编译安 ...

随机推荐

  1. LeakCanary,30分钟从入门到精通

    简述 在性能优化中,内存是一个不得不聊的话题:然而内存泄漏,显示已经成为内存优化的一个重量级的方向.当前流行的内存泄漏分析工具中,不得不提的就是LeakCanary框架:这是一个集成方便, 使用便捷, ...

  2. postgresql共享内存的三个结构体

    本文原创为freas_1990,转载请标明出处:http://blog.csdn.net/freas_1990/article/details/16105797 postgresql的共享内存维护主要 ...

  3. CSS-下拉导航条

    Web网站中很多时候都会出现下拉导航条,有的是通过CSS实现,有的通过JavaScript插件实现,其实CSS实现起来比较简单,先来看一个简版的下拉菜单: Html代码通过ul列表实现: <ul ...

  4. 糟糕的css用法 1

    现在网站追求越来越漂亮好看,越来越炫,所以css是必不可少的.可是我发现许多人使用css的方式是不对的,至少是不推荐的. 比如下面的css用法不对 (1)一个页面对应一个css文件 这种做法是我深恶痛 ...

  5. 卡尔曼滤波算法--核心公式推导导论 - ZZ

    卡尔曼滤波算法--核心公式推导导论 10 个月前 写在最前面:这是我第一篇专栏文章,感谢知乎提供这么一个平台,让自己能和大家分享知识.本人会不定期的开始更新文章,文章的内容应该集中在汽车动力学控制,整 ...

  6. 自己理解BFC 和 stack context , stack order

    1. stack order 发生在BFC计算好了之后. 2.一个一个的BFC里面,不同的block 里面的stack context 会根据 stack order的顺序,进行堆叠.呈现互相遮盖的效 ...

  7. 转:在centos7上安装memcache

    转:https://www.liquidweb.com/kb/how-to-install-memcached-on-centos-7/ http://devdocs.magento.com/guid ...

  8. External component has thrown an exception

    C#调用c++的DLL报错:External component has thrown an exception, 也没有log产生,怎么回事那? [解决方法] 这是因为c++的程序报错了,而且没有c ...

  9. PC 微信扫码登陆

    目录 1.注册微信开发平台 2.微信开发平台添加网站应用 3.PC微信登录流程介绍 4.获取用户基本信息(UnionID机制) 1.注册微信开发平台 官网网址 自行注册,需要注意的是注册邮箱号不用与腾 ...

  10. Masonry自动布局使用

    Masonry是一个轻量级的布局框架,采用更好的语法封装自动布局,它有自己的布局DSL.简洁明了并具有高可读性 而且同时支持 iOS 和 Max OS X. 下载 NSLayoutConstraint ...