JNI由浅入深_3_Hello World
1、需要准备的工具,eclipse,cdt(c++)插件,cygwin(unix)和 android ndk.
在cygwin的etc目录下将ndk的路径引入到profile文件中,可以在cygwin的任何目录都可以访问到ndk,不同的ndk路径PATH的写法不同.
  : ${ORIGINAL_PATH=${PATH}}
  if [ ${CYGWIN_NOWINPATH-addwinpath} = "addwinpath" ] ; then
    PATH="/usr/local/bin:/cygdrive/d/cgwin/android-ndk-r7b:/usr/bin${PATH:+:${PATH}}"
  else
    PATH="/usr/local/bin:/usr/bin:/cygdrive/d/cgwin/android-ndk-r7b"
  fi
2、开发步骤:
a.创建一个android工程
b.JAVA代码中写声明 native 方法 public native String helloFromJNI(); 通过javah 包名.类名生成jni的方法签名
c. 创建jni目录,编写c代码,方法名字要对应。或者将生成的签名文件拷贝到jni目录,然后在c代码中引入。
d.编写Android.mk文件
e.Ndk编译生成动态库( ndk -build )
f.Java代码load 动态库.调用native代码
2.1 创建一个Android项目,创建native方法.
public class MainActivity extends Activity {
    static{
        //加载二进制文件
        System.loadLibrary("Hello");//libHello.so 去掉lib和so
    }
    public native String helloFormC();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        System.out.println("------------"+helloFormC());
    }
}
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端的代码进行操作.
#include <stdio.h>
#include <jni.h>
#include <malloc.h>
#include "com_example_jni_MainActivity.h"; JNIEXPORT jstring JNICALL Java_com_example_jni_MainActivity_helloFormC
(JNIEnv * env, jobject obj){ return (*env)->NewStringUTF(env,"hello from c ... ");
}
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:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE :=Hello
LOCAL_SRC_FILES :=Hello.c
LOCAL_LDLIBS += -llog
include $(BUILD_SHARED_LIBRARY)
LOCAL_LDLIBS += -llog表示在jni中打印日志信息,次信息在android控制台上可以看到。需要在c文件中加入如下代码:
#include <android/log.h>
#define LOG_TAG "System.out.c"
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)
2.6 在android项目中的java文件引入编译生成的二进制文件。
static{
        //加载二进制文件
        System.loadLibrary("Hello");//libHello.so 去掉lib和so
}
2.7 最后部署项目,运行。
JNI由浅入深_3_Hello World的更多相关文章
- JNI由浅入深_10_JNI 综合开发
		
1.使用ndk-build时如果找不到某个类,可以使用下面两种方法解决: 1.1 进入src目录 D:\project3\JNIAndroid\src>set classpath=D:\proj ...
 - JNI由浅入深_9_JNI 异常处理
		
1 .本地代码中如何缓存和抛出异常 下面的代码中演示了如何声明一个会抛出异常的本地方法.CatchThrow这个类声明了一个会抛出IllegalArgumentException异常的名叫doit的本 ...
 - JNI由浅入深_8_JNI缓存字段和方法ID
		
获取字段ID和方法ID时,需要用字段.方法的名字和描述符进行一个检索.检索过程相对比较费时,因此本节讨论用缓存技术来减少这个过程带来的消耗.缓存字段ID和方法ID的方法主要有两种.两种区别主要在于缓存 ...
 - JNI由浅入深_7_c调用Java方法一
		
1.在Java中声明方法 <span style="font-size:14px;">/** * javah -encoding utf-8 -jni com.exam ...
 - JNI由浅入深_6_简单对象的应用
		
1.声明native方法 public class ComplexObject { /** * 返回一个对象数组 * @param val * @return */ public native Per ...
 - JNI由浅入深_5_基本类型应用
		
1.基本类型应用 对于JNI处理基本类型还是比较简单的,下面是Java代码: <span style="font-size:14px;"> public native ...
 - JNI由浅入深_4_JNI基础知识详解
		
Java Native Interface (JNI)标准是java平台的一部分,它允许Java代码和其他语言写的代码进行交互.JNI 是本地编程接口,它使得在 Java 虚拟机 (VM) 内部运行的 ...
 - JNI由浅入深_2_C语言基础
		
*含义 1.乘法 3*5 2.定义指针变量 int * p://定义了一个名字叫p的变量,能够存放int数据类型的地址 3.指针运算符, //如果p是一个已经定义好的指针变量则*p表示以p的内容为地址 ...
 - android studio 使用 jni 编译 opencv 完整实例 之 图像边缘检测!从此在andrid中自由使用 图像匹配、识别、检测
		
目录: 1,过程感慨: 2,运行环境: 3,准备工作: 4,编译 .so 5,遇到的关键问题及其解决方法 6,实现效果截图. (原创:转载声明出处:http://www.cnblogs.com/lin ...
 
随机推荐
- Web运行控制台输出乱码解决总结
			
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
 - Tomcat中使用commons-io-2.5发生的错误java.lang.ClassNotFoundException: org.apache.commons.io.IOUtils
			
关键词:IntelliJ IDEA.Tomcat.commons-io-2.5.jar.java.lang.ClassNotFoundException: org.apache.commons.io. ...
 - Spring的自动装配Bean
			
spring的自动装配功能的定义:无须在Spring配置文件中描述javaBean之间的依赖关系(如配置<property>.<constructor-arg>).IOC容器会 ...
 - h5的classList对象
			
H5新增属性classList h5中新增了一个classList,原生js可以通过它来判断获取dom节点有无某个class. classList是html元素对象的成员,它的使用非常简单,比如 co ...
 - 004bean作用域
			
1.Singleton(单例) 2.Prototype(原型)---->每次注入.通过Spring应用上下文获取,都会重新创建 @Scope(ConfigurableBeanFactory ...
 - D3.js 入门教程
			
最近需要用到d3, 记录下d3的教程 网上搜了几个关于d3的教程 D3.js 入门教程 http://wiki.jikexueyuan.com/project/d3wiki/author.h ...
 - 横向开关(switch)
			
横向开关(switch) 一:属性 1.Activity //横向开关 public class SwitchActivity extends Activity { private Switch sw ...
 - 中专生自学Android到找到工作的前前后后
			
我是一名中专生,在学校里读的是计算机专业,但是由于学校不好大部分同学都不爱学习来这里几乎大部分都是在混日子的,虽然我中考的成绩不差,但是因为家里穷考虑到以后没钱读大学我毅然来到这里,虽然是中专,但是我 ...
 - 《APP移动终端决胜之道视觉设计艺术》学习笔记
			
1.20-2.9 1.合理的层级化2.信息的整合(短信收发件箱),信息的整合就像创建文件夹,可以将相关的东西放在一起,以便于使用者搜索与查找3.(微信聊天界面)相比之下使用了对话框图形的界面,元素更加 ...
 - 比较和排序(IComparable和IComparer以及它们的泛型实现)(转)
			
C#笔记25:比较和排序(IComparable和IComparer以及它们的泛型实现) 本文摘要: 1:比较和排序的概念: 2:IComparable和IComparer: 3:IComparabl ...