android JNI 简单demo(2)它JNI demo 写

一、搭建Cygwin 环境:http://blog.csdn.net/androidolblog/article/details/25559013

二、JNI 基本要素:

1、编写 含native 方法的java文件。

2、把该文件用javah 生成 Cygwin 编译库时要用到的头文件,既*.h 文件。

3、编写*.c 文件。在*.c文件里,实现 *.h 中的方法。

4、编写mk文件。

5、配置NDK环境。

6、用Cygwin 编译库文件。

7、拷贝库文件到eclipseproject中的JNI demo。

8、调用 JNI中的native 方法。

三、JNI demo 编写具体:

1、编写native 方法的java类

MyJniMethod .java 
package com.lin.myjin;

public class MyJniMethod {
 
  static{
   System.loadLibrary("myJin");
  }
     public native void add(int add);
     public native void print(int i);
     public native int getadd(int add);
}

2、把该文件用javah 生成 Cygwin 编译库时要用到的头文件,既*.h 文件:

生成过程例如以下:下面文字是网上找的。认为写的挺全的。就直接贴了。

 如果你是用Eclipse开发。比如project在 D盘的myjin文件夹中,你有一个类Test.java具有包路径。比如 package cn.edu.xmu.zgy;

即在D:\MyTest\src\cn\edu\xmu\zgy\文件夹下会存放着你的Test.java文件。

那么要生成.h文件,则在控制台下切换到D:\MyTest\bin\classes文件夹下,然后输入 javah -jni cn.edu.xmu.zgy.Test
之后,就能够在D:\MyTest\bin\classes\文件夹下能够找到 cn_edu_xmu_zgy_Test.h头文件。

原理:eclipse下的androidproject被编译后,会把java生成字节码class文件。所用直接跳转到编译了的project的classes文件夹,然后用java
- jni *.class 的文件名称。生成h文件。

注意

(1)生成的*.h一定要带包名的h文件。在*.class 文件所在文件夹下, 进行javah -jni * 生成的文件是不带包名的。

(2)这里的 javah
-jni cn.edu.xmu.zgy.Test而不是 javah -jni  cn.edu.xmu.zgy.Test.class

以下是我生成头文件的截图:project名是
myJin

生成的com_lin_myjin_MyJniMethod.h 文件例如以下:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_lin_myjin_MyJniMethod */
#ifndef _Included_com_lin_myjin_MyJniMethod
#define _Included_com_lin_myjin_MyJniMethod
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class: com_lin_myjin_MyJniMethod
 * Method: add
 * Signature: (I)V
 */
JNIEXPORT void JNICALL Java_com_lin_myjin_MyJniMethod_add
  (JNIEnv *, jobject, jint);
/*
 * Class: com_lin_myjin_MyJniMethod
 * Method: print
 * Signature: (I)V
 */
JNIEXPORT void JNICALL Java_com_lin_myjin_MyJniMethod_print
  (JNIEnv *, jobject, jint);
/*
 * Class: com_lin_myjin_MyJniMethod
 * Method: getadd
 * Signature: (I)I
 */
JNIEXPORT jint JNICALL Java_com_lin_myjin_MyJniMethod_getadd
  (JNIEnv *, jobject, jint);
#ifdef __cplusplus
}
#endif
#endif

3、编写*.c 文件,在*.c文件里,实现 *.h 中的方法:

这里以:

JNIEXPORT jint JNICALL Java_com_lin_myjin_MyJniMethod_getadd
  (JNIEnv * env, jobject obj, jint count)
  {
       return count+8;
 
  }

为例

com_lin_myjin_MyJniMethod.c
文件内容:

#include "com_lin_myjin_MyJniMethod.h"
//#define LOG_TAG "Android-T"
//#undef LOG
//#include <android/log.h>
//#define LOGD(a) __android_log_print(ANDROID_LOG_DEBUG,LOG_TAG,a)
//#define LOGD2(a,b) __android_log_print(ANDROID_LOG_DEBUG,LOG_TAG,a,b)
// #define DBUG
#include <sys/ioctl.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <termios.h>
JNIEXPORT void JNICALL Java_com_lin_myjin_MyJniMethod_add
  (JNIEnv * env, jobject obj, jint count)
  {
 
  }
/*
 * Class: com_lin_myjin_MyJniMethod
 * Method: print
 * Signature: (I)V
 */
JNIEXPORT void JNICALL Java_com_lin_myjin_MyJniMethod_print
  (JNIEnv * env, jobject obj, jint count)
  {
 
  }
/*
 * Class: com_lin_myjin_MyJniMethod
 * Method: getadd
 * Signature: (I)I
 */
JNIEXPORT jint JNICALL Java_com_lin_myjin_MyJniMethod_getadd
  (JNIEnv * env, jobject obj, jint count)
  {
       return count+8;
 
  }
4、编写mk文件:
关于MK文件。可自行了解。

在此不赘述。


Android.mk文件:
内容:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := myJin
LOCAL_SRC_FILES := com_lin_myjin_MyJniMethod.c
include $(BUILD_SHARED_LIBRARY)

5、配置NDK环境:
在这里。NDK不用配置环境变量。原理是用绝对路径操作命令。

在Cygwin下,跳转到你 C文件 h文件 mk 文件的文件夹。或者把这三个文件复制到一个叫jni的文件夹以下。文件夹名字能够随便取。
然后跳转到含有这三个文件的文件夹,输入:/cygdrive/d/android-ndk-r5b/ndk-build  回车。

/cygdrive/d/这个部分依据你 存放android-ndk-r5b/ndk-build的文件夹变化而变化。仅仅要能直接精确到android-ndk-r5b/ndk-build 即可。

原理:$符号取加入在环境变量中的 命令或者文件夹。


举例:自己定义一个myCommand 命令,实现命令是 cd .  .   即跳转到上层文件夹。

加入myCommand 成功后。能够直接用 $myCommand 来实现 cd  .. 
所以:网上的NDK-Build 命令 事实上是/cygdrive/d/android-ndk-r5b/ndk-build  的方便操作模式。前提是你加入了NDK-Build环境变量。
myCommand 命令截图:

6、用Cygwin 编译库文件步骤:

(1)新建一个jni文件夹:

(2)文件夹以下放三个文件: 跳转到对应文件夹 输入:/cygdrive/d/android-ndk-r5b/ndk-build  回车

生成的库文件:



6、拷贝库文件到eclipseproject中的project,这里是myJin:这个名字本来是打算打myJni的。大家当做project名就好。

注意:

(1)库文件名称通常是lib**.so  载入时名字是 **.so 比方上面的 库文件是libmyJin.so 而载入处是 myJin

(2)载入库时。文件名称不带库文件后缀 .so

(3)载入库代码块 要静态载入。

7、调用 JNI中的native 方法:



执行结果是:



可见 加过是12  也就是4+8的结果。说明代码已经正常调用。

projectdemo源代码链接:http://download.csdn.net/detail/linhuorongandroid/7332143

结语:该代码demo上十分简单。目的仅仅是跑个JNI流程。有所不足。多多不吝赐教。

版权声明:本文博客原创文章。博客,未经同意,不得转载。

android JNI 简单demo(2)它JNI demo 写的更多相关文章

  1. Android初步 简单demo

    刚入门不久,没学JAVA,从C++转过来的,C++的QT和安卓简直有异曲同工之妙,为了加深自己对安卓的理解,特写博客以记录,望大神们多多指点. 效果图,刚入门的话,肯定要熟悉基本的控件的使用,这跟我学 ...

  2. Android串口操作,简化android-serialport-api的demo(转载)

    原帖地址:点击打开 最近在做android串口的开发,找到一个开源的串口类android-serialport-api.其主页在这里http://code.google.com/p/android-s ...

  3. Android studio 使用NDK工具实现JNI编程

    前言: Android开发中常常会使用到第三方的.so库.在使用.so库的时候就要用到JNI编程.JNI是Java Native Interface的缩写.它提供了若干的API实现了Java和其它语言 ...

  4. socket.io简单说明及在线抽奖demo

    socket.io简单说明及在线抽奖demo socket.io 简介 Socket.IO可以实现实时双向的基于事件的通信. 它适用于各种平台,浏览器或设备,也同样注重可靠性和速度. socket.i ...

  5. Android调用系统相册和拍照的Demo

    最近我在群里看到有好几个人在交流说现在网上的一些Android调用系统相册和拍照的demo都有bug,有问题,没有一个完整的.确实是,我记得一个月前,我一同学也遇到了这样的问题,在低版本的系统中没问题 ...

  6. 二、Android NDK编程预备之Java jni入门Hello World

    转自:  http://www.eoeandroid.com/forum.php?mod=viewthread&tid=264543&fromuid=588695 昨天已经简要介绍了J ...

  7. Android jni/ndk编程二:jni数据类型转换(primitive,String,array)

    一.数据类型映射概述 从我们开始jni编程起,就不可能避开函数的参数与返回值的问题.java语言的数据类型和c/c++有很多不同的地方,所以我们必须考虑当在java层调用c/c++函数时,怎么正确的把 ...

  8. 【Android】Eclipse自动编译NDK/JNI的三种方法

    [Android]Eclipse自动编译NDK/JNI的三种方法 SkySeraph Sep. 18th  2014 Email:skyseraph00@163.com 更多精彩请直接访问SkySer ...

  9. android 学习随笔二十七(JNI:Java Native Interface,JAVA原生接口 )

    JNI(Java Native Interface,JAVA原生接口) 使用JNI可以使Java代码和其他语言写的代码(如C/C++代码)进行交互. 问:为什么要进行交互? 首先,Java语言提供的类 ...

随机推荐

  1. JAVA命令参数详解

    JAVA命令参数详解 JAVA命令详解 结构 说明 Java 和 OldJava JIT 选项 另请参阅 结构 java [ options ] class [ argument ... ] java ...

  2. BZOJ 1038 ZJOI2008 瞭望塔 半平面交

    题目大意及模拟退火题解:见 http://blog.csdn.net/popoqqq/article/details/39340759 这次用半平面交写了一遍--求出半平面交之后.枚举原图和半平面交的 ...

  3. macbook连接linuxserver后不显示matlab桌面[问题]

    macbook 登录远程linuxserver.Macbook今天,系统版本号10.9.4.这是更新,打开matlab当提醒x11不存在.一个接着安装Xquarz2.7.6. matlab它可以在本地 ...

  4. HDU 1828 Picture(长方形的周长和)

    HDU 1828 Picture 题目链接 题意:给定n个矩形,输出矩形周长并 思路:利用线段树去维护,分别从4个方向扫一次,每次多一段的时候,就查询该段未被覆盖的区间长度,然后周长就加上这个长度,4 ...

  5. Uva562(dp)

    给我们n个硬币 每个硬币都有它的面值,要我我们分为两堆硬币,使得硬币的差值最小 我们可以dp计算出所有的差值,然后从小到大枚举差值,如果差值存在,就输出 dp[i][j] 表示对于前i件物品能达到差值 ...

  6. hdu1507最大匹配

    题意:给出n*m的矩阵方块,某些方块是ponds,这些方块不能出售,然后能出售的是1*2的方块 要求求出有多少块1*2的方块能够出售,并输出这些方块的坐标(specia judge) 关键是怎么建出二 ...

  7. Leetcode 3Sum Closet

    二手和3Sum像几乎相同的想法.二进制搜索.关键修剪.但是,在修剪做出很多错误. 然后还有一个更加速了原来的想法O(n^2). #include<iostream> #include &l ...

  8. HTML学习_01

    html总结 html是一门标记语言,也就是不经过编译就能直接执行的语言,不像是c/c++/java等等须要转换成二进制码, html是一门最主要的学科,提供了一个框架,提供了各种标签和规则,使得语言 ...

  9. cidaemon.exe过程cpu入住率和关闭cidaemon.exe加工方法

    问题叙述性说明:   这个时间机器始终是一个奇怪的问题:cidaemon.exe这个过程需要CUP率98%以上,大大影响了正常使用电脑.多个资源管理器出现cidaemon.exe过程,cpu率最高的一 ...

  10. PHP读取Excel里的文件

    下载phpExcelReader  http://sourceforge.net/projects/phpexcelreader 解压后得到以下这些文件 jxlrwtest.xls这个excel文件有 ...