android JNI入门-学习笔记

JNI入门-学习笔记

可执行文件  Windows - *.exe | linux - *.elf
c函数库文件 Windows - *.dll | linux - *.so
批处理文件  Windows - *.bat | linux - *.sh

工具

NDK -- native developer kits

Cygwin -- Linux系统模拟器

  • 安装过程要点: ——安装时可以联网安装也可以通过本地文件安装(如果有本地文件) ——Select Packages:没必要全部安装,安装Devel和Shells这两个即可 ——安装好后双击桌面快捷图标进入Cygwin命令控制台 指令:cd.. | cd.. | ls | cd cygdrive
  • 为了方便在任何目录执行指令ndk-build,需要环境变量的配置: 来到Cygwin的安装目录 ../cygwin/etc/profile,打开profile文件,修改PATH的值,多个环境变量之间用冒号(:)分隔。例如这样:PATH="...:/cygdrive/c/android-ndk-r7b:...", 如果不成功,也可以配置Windows下的系统环境变量使用cmd运行

CDT -- 为了方便在eclipse开发c代码 让c代码高亮显示

  • 全称: CDT:c/c++ developer tools ADT:android developer tools
  • 安装步骤: eclipse --> help --> install new software --> add --> Name:cdt|Location:adt.zip --> next。 这时有两个插件供选择CDT Main Features和CDT Optional Features,只选择前者即可,Contact all update sites...这个选项是联网更新,可以不选,next,安装好后eclipse中会有个C/C++的视图

JNI开发之HelloWorld

第一步: 新建一个Android工程,定义一个本地方法

public class MainActivity extends Activity {

    // 定义一个本地方法,相当于c的接口,需要用c代码对这个方法做实现
    public native String helloFromC();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    ...
}

第二步: 在工程下新建一个文件夹叫jni,必须是这个文件名,然后再该文件夹下新建一个文件,比如叫Hello.c,在Hello.c文件中编写C代码,这个方法名比较长,快捷生成方式:cmd--cd到工程src目录下,输入命令javah com.example.helloworldformc.MainActivity(全类名),会在src目录下回生成一个.h的头文件,将此文件拷贝到jni目录下,打开该文件复制里面的方法去掉分号加上{}即可

#include <stdio.h>
#include <jni.h>

// Java+全类名+方法名,用_连接每个单词
jstring Java_com_example_helloworldformc_MainActivity_helloFromC(JNIEnv* env,jObject obj){
    return (*env)->NewStringUTF(env,"hellofromc");
}

第三步: 在jni文件夹下创建Android.mk文件

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

# 对应打包成函数库的名字,你想打包成什么文件名,这里就写成什么,
LOCAL_MODULE    := hello
# 对应C代码的文件名
LOCAL_SRC_FILES := Hello.c

include $(BUILD_SHARED_LIBRARY)

第四步:

把C代码打包成函数库:cmd--> cd到Android工程所在目录 --> ndk-build(交叉编译命令),刷新下工程,在libs/armeabi中就会有一个.so文件,文件名是lib+hello(mk中定义的库名),并且工程中会多出来一个obj的文件夹,主要存放的是中间文件

第五步: 在Java代码中引入函数库

// 使用静态代码块在Java代码中引入函数库
static{
    System.loadLibrary("hello");
}

第六步:

public void method(){
    // 调用
    String str = helloFromC();
    Toast.makeText(getApplicationContext(), str, 1).show();
}

** 注意 **

  • 引用别人的.so函数库时,需要你自己native方法对应类的包名 和之前他人打包成.so函数库时的包名一致
  • 如果需要在C语言中打印日志,需要引入头文件

    eg:#include <android/log.h>

    但是log的方法名太长不好记,我们需要做下处理

    eg: #define LOGTAG "clog" #define LOGD(...) androidlogprint(ANDROIDLOGDEBUG, LOGTAG, __VAARGS) #define LOGI(...)androidlogprint(ANDROIDLOGINFO, LOGTAG, _VAARGS)

    另外在mk文件中加上一句:LOCAL_LDLIBS += -llog

    在C代码中类似这样调用:LOGD("x = %d",x);

C调用Java

原理:C通过反射的方法调用Java的方法 C中有类似获取class对象,获取methodId,调用五返回值方法CallVoidMethod等等方法 上述方法可以到头文件jni.h中去找, jni.h所在目录:android-ndk-r7b\platforms\android-8\arch-arm\usr\include 通过这些方法可以实现C代码调用Java代码 获取方法签名:cd到bin目录下的classes文件夹下,javap -s 方法所在类的全类名

C

头文件 *.h
库文件 *.so/*.o
两者关系的比喻:头文件相当于Java中的接口文件,库文件相当于Java中的实现类文件

工具下载:http://pan.baidu.com/s/1mg2zvN6


其他精彩文章


android学习笔记(41)android选项菜单和子菜单(SubMenu )

android学习笔记(40)Notification的功能与用法

android学习笔记(42)android使用监听器来监听菜单事件

android学习笔记(43)android创建单选菜单和复选菜单

android学习笔记(44)android设置与菜单项关联的Activity

android学习笔记(45)android上下文菜单

jQuery教程(12)-ajax操作之基于请求加载数据

jQuery教程(13)-ajax操作之追加 HTML

更多关于android开发文章

时间: 2024-10-27 09:46:31

android JNI入门-学习笔记的相关文章

JNI入门-学习笔记

JNI入门-学习笔记 可执行文件 Windows - *.exe | linux - *.elf c函数库文件 Windows - *.dll | linux - *.so 批处理文件 Windows - *.bat | linux - *.sh 工具 NDK -- native developer kits Cygwin -- Linux系统模拟器 安装过程要点: ——安装时可以联网安装也可以通过本地文件安装(如果有本地文件) ——Select Packages:没必要全部安装,安装Devel

Hadoop入门学习笔记---part4

紧接着<Hadoop入门学习笔记---part3>中的继续了解如何用java在程序中操作HDFS. 众所周知,对文件的操作无非是创建,查看,下载,删除.下面我们就开始应用java程序进行操作,前提是按照<Hadoop入门学习笔记---part2>中的已经在虚拟机中搭建好了Hadoop伪分布环境:并且确定现在linux操作系统中hadoop的几个进程已经完全启动了. 好了,废话不多说!实际的例子走起. 在myeclipse中新建一个java工程: 在项目工程中新建一个lib包用于存放

Hadoop入门学习笔记---part1

随着毕业设计的进行,大学四年正式进入尾声.任你玩四年的大学的最后一次作业最后在激烈的选题中尘埃落定.无论选择了怎样的选题,无论最后的结果是怎样的,对于大学里面的这最后一份作业,也希望自己能够尽心尽力,好好做.正是因为选题和hadoop有关,现在正式开始学习hadoop.将笔记整理于此,希望与志同道合的朋友共同交流. 作者:itRed 邮箱:[email protected] 个人博客链接:http://www.cnblogs.com/itred 好了,废话不多说.进入正题!开始hadoop的学习

汇编入门学习笔记 (六)—— si、di,双重循环

疯狂的暑假学习之  汇编入门学习笔记 (六)-- si.di,双重循环 参考: <汇编语言> 王爽 第7章 1. and和or指令,与[bx+idata] and和or,就不多说了. [bx+idata] 这样写是可以的,某些情况下,比较方便. [bx+idata] 也可以写成 idata[bx] 直接见例子: 把'ABcde' 跟 'fGHig' 都改成大写(ASCII中大写字母与小写字母二进制中,只有第五位不同,大写字母是0,小写字母是1) assume cs:code,ds:data d

[Android游戏开发学习笔记]View和SurfaceView

本文为阅读http://blog.csdn.net/xiaominghimi/article/details/6089594的笔记. 在Android游戏中充当主要角色的,除了控制类就是显示类.而在Android中涉及到显示的是View类,及继承自它的SurfaceView类和SurfaceView的其他子类等. 这里先只说View和SurfaceView.SurfaceView的直接子类有GLSurfaceView和VideoView,可以看出GL和视频播放以及CAmera摄像头一般均使用Su

汇编入门学习笔记 (八)—— 转移指令

疯狂的暑假学习之  汇编入门学习笔记 (八)--  转移指令 參考: <汇编语言> 王爽 第9章 能够改动ip或者同一时候改动cs和ip的指令统称为转移指令. 8086CPU转移行为分为: 段内转移:仅仅改动ip 段间转移:同一时候改动cs和ip 段内转移按ip改动的范围可分为: 短转移:ip改动范围 -128~127 近转移:ip改动范围 -32768~32767 转移指令分为: 无条件转移指令.如 jmp 条件转移指令 循环指令.如 loop 过程. 中断. 1. offset,nop指令

Android中ActivityManager学习笔记(3)

在之前写过2篇关于ActivityManager的文章,如下所示.都是通过实战去了解里面的信息,现在感觉太繁琐,所以做一个api介绍比较详细.就像之前学习Telephony那样,对整体了解整个ActivityManager很有用. Android中ActivityManager学习笔记(1)-MemoryInfo Android中ActivityManager学习笔记(2)-RunningServiceInfo ActivityManager android.app包,含有6个内部类: Memo

Hadoop入门学习笔记---part3

2015年元旦,好好学习,天天向上.良好的开端是成功的一半,任何学习都不能中断,只有坚持才会出结果.继续学习Hadoop.冰冻三尺,非一日之寒! 经过Hadoop的伪分布集群环境的搭建,基本对Hadoop有了一个基础的了解.但是还是有一些理论性的东西需要重复理解,这样才能彻底的记住它们.个人认为重复是记忆之母.精简一下: NameNode:管理集群,并且记录DataNode文件信息: SecondaryNameNode:可以做冷备份,对一定范围内的数据作快照性备份: DataNode:存储数据:

Android自定义View学习笔记04

Android自定义View学习笔记04 好长时间没有写相关的博客了,前几周在帮学姐做毕设,所以博客方面有些耽误.过程中写了一个类似wp的磁贴的view,想再写个配套的layout,所以昨天看了一下自定义viewGroup的相关知识-晚上睡觉想了一下可行性不是很高-代码量还不如直接自己在xml上写来得快,速度上也是个问题.今天看了一下张鸿洋老师的Android 自定义View (三) 圆环交替 等待效果这篇博文,再加上前一段时间看到的一幅图,结合之前写的一个圆形imageView的实现博文And