android JNI调用(Android Studio 3.0.1)(转)
最近回头复习了一下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)(转)的更多相关文章
- android JNI调用机制
JNI的出现使得开发者既可以利用Java语言跨平台.类库丰 富.开发便捷等特点,又可以利用Native语言的高效. JNI是JVM实现中的一部分,因此Native语言和Java代码都运行在JVM的宿主 ...
- Cocos2d-x3.3RC0通过JNI调用Android的Java层URI代码发送短信
1.Jni不在赘述.翻看前面博客 2.直接上代码 1)Java层,直接加在AppActivity.java中 public class AppActivity extends Cocos2dxActi ...
- android JNI调用(转)
Android jni开发资料--NDK环境搭建 android开发人员注意了 谷歌改良了ndk的开发流程,对于Windows环境下NDK的开发,如果使用的NDK是r7之前的版本,必须要安装Cygwi ...
- Android Jni调用浅述
声明:欢迎转载,转载时请注明出处!http://blog.csdn.net/flydream0/article/details/7371692 1 简述 JNI是Java Native Interfa ...
- Android Jni 调用
Chap1:JNI完全手册... 3 Chap2:JNI-百度百科... 11 Chap 3:javah命令帮助信息... 16 Chap 4:用javah产生一个.h文件... 17 Chap5:j ...
- Android JNI的Android.mk文件语法详解
Android.mk简介: Android.mk文件用来告知NDK Build 系统关于Source的信息. Android.mk将是GNU Makefile的一部分,且将被Build System解 ...
- android JNI 调用NDK方法
@import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/c ...
- android JNI调用 execlp函数
execlp()函数 execlp函数简单的来说就是C语言中执行系统命令的函数 execlp()会从PATH 环境变量所指的目录中查找符合参数file 的文件名, ...
- Ubuntu系统下实现Android工程调用独立编译的C++程序和GMP、PBC库
目的: 实现使用C++编写代码供Android工程调用.C++代码中可以使用STL库,也可以使用常用的由源码编译生成的库,如PBC.因为PBC是基于GMP库的,所以这里只记录了GMP和PBC库的编译安 ...
随机推荐
- Android 代码实现应用强制装到手机内存
在Froyo(android 2.2,API Level:8)中引入了android:installLocation.通过设置该属性可以使得开发者以及用户决定程序的安装位置. android:inst ...
- 用开源项目JazzyViewPager实现ViewPager切换动画
JazzyViewPager这个项目可以让viewpager有各种绚丽的动画,而且还可以自由扩展.但从官网下载的lib导入时会出现找不到视图的问题,不知道是不是我人品不行,所以我就自己写了lib.总之 ...
- 让java从Mysql返回多个ResultSet
首先,JDBC对于SQLSERVER来说默认是支持返回,但对于MySql来说,只默认支持存储过程返回多个ResultSet,那对于手写SQL怎么办. 其实很简单,只要一个在连接字符串中加一个参数:al ...
- 使用 Golang 编写链代码 (v0.6 )
https://www.ibm.com/developerworks/cn/cloud/library/cl-ibm-blockchain-chaincode-testing-using-golang ...
- [转]Linux的SOCKET编程详解
From : http://blog.csdn.net/hguisu/article/details/7445768 1. 网络中进程之间如何通信 进 程通信的概念最初来源于单机系统.由于每个进程都在 ...
- BZOJ 1093 最大半连通子图 题解
1093: [ZJOI2007]最大半连通子图 Time Limit: 30 Sec Memory Limit: 162 MBSubmit: 2767 Solved: 1095[Submit][S ...
- 11.2.0.3 RAC(VCS)节点crash以及hang的问题分析
昨天某个客户的一套双节RAC当中一个节点crash,同一时候最后导致另外一个节点也hang住,仅仅能shutdown abort. 且出现shutdown abort实例之后,还有部分进程无法通过ki ...
- [leetcode]Jump Game @ Python
原题地址:https://oj.leetcode.com/problems/jump-game/ 题意: Given an array of non-negative integers, you ar ...
- sda, sdb, sdc, sda1, sda2在Linux中都代表什么
意义如下: 第一个软驱 /dev/fd0. 第二个软驱 /dev/fd1. 第一块硬盘 /dev/sda. 第二块硬盘 /dev/sdb, 以此类推. 第一个SCSI CD-ROM /dev/scd0 ...
- jQuery源码分析-构造函数详解
在jQuery.js的构造函数中,充分利用了JavsScript语言的动态性——对行参的类型和个数没有的严格要求,以至于一个函数可以实现多种功能需求,也为JavaScript语言的多态性提供了基础,在 ...