1、需要准备的工具,eclipse,cdt(c++)插件,cygwin(unix)和 android ndk.

  在cygwin的etc目录下将ndk的路径引入到profile文件中,可以在cygwin的任何目录都可以访问到ndk,不同的ndk路径PATH的写法不同.

  1. : ${ORIGINAL_PATH=${PATH}}
  2. if [ ${CYGWIN_NOWINPATH-addwinpath} = "addwinpath" ] ; then
  3. PATH="/usr/local/bin:/cygdrive/d/cgwin/android-ndk-r7b:/usr/bin${PATH:+:${PATH}}"
  4. else
  5. PATH="/usr/local/bin:/usr/bin:/cygdrive/d/cgwin/android-ndk-r7b"
  6. fi

2、开发步骤:

  1. a.创建一个android工程
  2. b.JAVA代码中写声明 native 方法 public native String helloFromJNI(); 通过javah 包名.类名生成jni的方法签名
  3. c. 创建jni目录,编写c代码,方法名字要对应。或者将生成的签名文件拷贝到jni目录,然后在c代码中引入。
  4. d.编写Android.mk文件
  5. e.Ndk编译生成动态库( ndk -build )
  6. f.Java代码load 动态库.调用native代码

  2.1 创建一个Android项目,创建native方法.

  1. public class MainActivity extends Activity {
  2. static{
  3. //加载二进制文件
  4. System.loadLibrary("Hello");//libHello.so 去掉lib和so
  5. }
  6. public native String helloFormC();
  7.  
  8. @Override
  9. protected void onCreate(Bundle savedInstanceState) {
  10. super.onCreate(savedInstanceState);
  11. setContentView(R.layout.activity_main);
  12. System.out.println("------------"+helloFormC());
  13. }
  14.  
  15. }

2.2 javah命令生成签名

进入到项目的bin/classes命令下,执行命令 javah com.example.jni.MainActivity,将生成的头文件拷贝到jni目录下,在c文件中引入头文件 #include "com_example_jni_MainActivity.h" 。下面是javah命令的参数 和 生产头文件方式。

 在使用javah命令时如果遇到找不到Activity类,说明android的jar包没有导入进去,一种办法将jar包加入到classpath路径中去,classpath   .;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\tools.jar;E:\developLib\android\platforms\android-8\android.jar;另一种方法是在window命令窗口执行:D:\project3\JNIAndroid>set classpath=D:\project3\JNIAndroid\src。

2.3 创建C文件

jobject  就是当前方法所在的类代表的对象.JNIEnv类型代表了java环境
通过JNIEnv* 指针,就可以对java端的代码进行操作.

  1. #include <stdio.h>
  2. #include <jni.h>
  3. #include <malloc.h>
  4. #include "com_example_jni_MainActivity.h";
  5.  
  6. JNIEXPORT jstring JNICALL Java_com_example_jni_MainActivity_helloFormC
  7. (JNIEnv * env, jobject obj){
  8.  
  9. return (*env)->NewStringUTF(env,"hello from c ... ");
  10. }

2.4 编译

通过cygwin编译c文件,进入到项目目录,我的项目名称是jni,进入之后执行“ndk-build”命令,出现如下图所示表示执行成功。

  2.5 创建Android.mk文件

需要将hello-jni替换成自己的c文件模块名称,在ndk中的位置 file:///D:/cgwin/android-ndk-r7b/docs/ANDROID-MK.html:

  1. LOCAL_PATH := $(call my-dir)
  2. include $(CLEAR_VARS)
  3. LOCAL_MODULE :=Hello
  4. LOCAL_SRC_FILES :=Hello.c
  5. LOCAL_LDLIBS += -llog
  6. include $(BUILD_SHARED_LIBRARY)

LOCAL_LDLIBS += -llog表示在jni中打印日志信息,次信息在android控制台上可以看到。需要在c文件中加入如下代码:

  1. #include <android/log.h>
  2. #define LOG_TAG "System.out.c"
  3. #define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
  4. #define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)

2.6 在android项目中的java文件引入编译生成的二进制文件。

  1. static{
  2. //加载二进制文件
  3. System.loadLibrary("Hello");//libHello.so 去掉lib和so
  4. }

  2.7 最后部署项目,运行。

JNI由浅入深_3_Hello World的更多相关文章

  1. JNI由浅入深_10_JNI 综合开发

    1.使用ndk-build时如果找不到某个类,可以使用下面两种方法解决: 1.1 进入src目录 D:\project3\JNIAndroid\src>set classpath=D:\proj ...

  2. JNI由浅入深_9_JNI 异常处理

    1 .本地代码中如何缓存和抛出异常 下面的代码中演示了如何声明一个会抛出异常的本地方法.CatchThrow这个类声明了一个会抛出IllegalArgumentException异常的名叫doit的本 ...

  3. JNI由浅入深_8_JNI缓存字段和方法ID

    获取字段ID和方法ID时,需要用字段.方法的名字和描述符进行一个检索.检索过程相对比较费时,因此本节讨论用缓存技术来减少这个过程带来的消耗.缓存字段ID和方法ID的方法主要有两种.两种区别主要在于缓存 ...

  4. JNI由浅入深_7_c调用Java方法一

    1.在Java中声明方法 <span style="font-size:14px;">/** * javah -encoding utf-8 -jni com.exam ...

  5. JNI由浅入深_6_简单对象的应用

    1.声明native方法 public class ComplexObject { /** * 返回一个对象数组 * @param val * @return */ public native Per ...

  6. JNI由浅入深_5_基本类型应用

    1.基本类型应用 对于JNI处理基本类型还是比较简单的,下面是Java代码: <span style="font-size:14px;"> public native ...

  7. JNI由浅入深_4_JNI基础知识详解

    Java Native Interface (JNI)标准是java平台的一部分,它允许Java代码和其他语言写的代码进行交互.JNI 是本地编程接口,它使得在 Java 虚拟机 (VM) 内部运行的 ...

  8. JNI由浅入深_2_C语言基础

    *含义 1.乘法 3*5 2.定义指针变量 int * p://定义了一个名字叫p的变量,能够存放int数据类型的地址 3.指针运算符, //如果p是一个已经定义好的指针变量则*p表示以p的内容为地址 ...

  9. android studio 使用 jni 编译 opencv 完整实例 之 图像边缘检测!从此在andrid中自由使用 图像匹配、识别、检测

    目录: 1,过程感慨: 2,运行环境: 3,准备工作: 4,编译 .so 5,遇到的关键问题及其解决方法 6,实现效果截图. (原创:转载声明出处:http://www.cnblogs.com/lin ...

随机推荐

  1. SQLServer数据库系统概念

    数据模型是一种抽象模型,现实世界中的客观事物是彼此相互联系的 (1)数据模型是一组集成的概念,用户描述和操作组织内的数据,数据间的联系以及对数据的约束,它包含了数据结构,数据操作和完整性约束 (2)概 ...

  2. sql:Mysql create view,function,procedure

    create database Liber; use Liber; #顯示數据庫 20150210 Geovin Du 涂聚文 SHOW DATABASES; drop table BookKindL ...

  3. java截取字符串

    public class Temp { public static void main(String[] args) { String a="dsadgafa34"; System ...

  4. C#多线程顺序依赖执行控制

    在开发过程中,经常需要多个任务并行的执行的场景,同时任务之间又需要先后依赖的关系.针对这样的处理逻辑,通常会采用多线程的程序模型来实现. 比如A.B.C三个线程,A和B需要同时启动,并行处理,且B需要 ...

  5. springboot整合fastdfs实现上传和下载

    FastDFS_Client源码 https://github.com/tobato/FastDFS_Client 友情提示:由于FastDFS_Client这个源码不是很多,并且目前没有找到相关文档 ...

  6. Azure 中部署Gitlab的方法

    一.Azure 中创建Gitlab虚拟机(1).登陆Azure:打开Azure 官网,点击右侧上方的登陆Azure门户,输入Azure帐号与密码,点击 登陆 . (2).创建Gitlab虚拟机:登陆A ...

  7. asp.net 服务器控件的 ID,ClientID,UniqueID 的区别

    1.简述 ID是设计的时候自己所指定的ID,是我们分配给服务器控件的编程标识符,我们常常使用this.controlid来寻找控件,那么这个controlid就是这里所说的ID. ClientID是由 ...

  8. 倒计时特效的CountAnimationLabel

    倒计时特效的CountAnimationLabel 效果: 源码: CountAnimationLabel.h 与 CountAnimationLabel.m // // CountAnimation ...

  9. Apache配置支持目录浏览

      主配置文件 httpd.conf 中修改: 1)添加支持模块 LoadModule autoindex_module modules/mod_autoindex.so LoadModule dir ...

  10. iPhone的设备名转换

    def convertDeviceName(self, deviceName): """ 转换deviceName(如iPhone 6,2)为用户习惯形式(如iPhone ...