cygwin+ndk+eclipse下JNI技术入门

1、JNI的编写步骤
1)编写带有native 声明的java类.
2)编译java文件成class类
3)使用javah -jni com.ikags.project.XXXX 编译成.h文件
4)使用C/C++编写代码
5)编写makefile文件,将.h和.c(.cpp)文件编译成.dll(.so)文件
6)将.dll(.so)文件提供给项目,用system.loadLibrary方法调用.

2、编写makefile文件
make执行时,自动寻找Makefile(makefile)文件,然后执行编译工作。
在一个Makefile中通常包含下面内容:
1)需要由make工具创建的目标体(target),通常是目标文件或可执行文件。
2)要创建的目标体所依赖的文件(dependency_file)。
3)创建每个目标体时需要运行的命令(command)。

3、Android.mk写法
(1)Android.mk文件首先需要指定LOCAL_PATH变量,用于查找源文件。由于一般情况下
Android.mk和需要编译的源文件在同一目录下,所以定义成如下形式:
LOCAL_PATH:=$(call my-dir)
上面的语句的意思是将LOCAL_PATH变量定义成本文件所在目录路径。
(2)Android.mk中可以定义多个编译模块,每个编译模块都是以include $(CLEAR_VARS)开始
以include $(BUILD_XXX)结束。
include $(CLEAR_VARS)
CLEAR_VARS由编译系统提供,指定让GNU MAKEFILE为你清除除LOCAL_PATH以外的所有LOCAL_XXX变量,
如LOCAL_MODULE,LOCAL_SRC_FILES,LOCAL_SHARED_LIBRARIES,LOCAL_STATIC_LIBRARIES等。
include $(BUILD_STATIC_LIBRARY)表示编译成静态库
include $(BUILD_SHARED_LIBRARY)表示编译成动态库。
include $(BUILD_EXECUTABLE)表示编译成可执行程序

4、jni调用例子
编码前提,cygwin+ndk+eclipse搭建的开发环境,能够正常编译运行
第一个jni测试程序还是打印hello,world
4.1写好java,native方法,以及调用lib名
package jni;
public class Hello
{
    public native void sayHello();
    static
    {
     System.out.println(System.getProperty("java.library.path"));
        System.loadLibrary("hello");
    }
    public static void main(String[] args)
    {
     
        Hello h = new Hello();
        h.sayHello();
    }
}
4.2、使用javah -jni 全包名+类名 编译成.h文件
编译通过后,class文件在工程的bin目录下。
进入到dos状态,cd 到工程的bin目录,运行命令如下:
 javah -jni jni.Hello
正常情况下,jni_Hello.h会出现在bin目录下

4.3、生成.so文件
1)新建hello.c文件
然后我们建立一个C++工程,在src目录下建立一个jni目录,
将刚刚建立好的jni_Hello.h文件copy到jni目录,
并在jni目录下建立一个 hello.c文件,用来实现头文件中声明的方法,代码如下:
#include <jni.h>
#include "jni_Hello.h"
#include <stdio.h>
#ifdef __cplusplus
extern "C"
{
#endif
#ifdef __cplusplus
}
#endif

JNIEXPORT void JNICALL Java_jni_Hello_sayHello(JNIEnv *env, jobject obj) {
   printf("Hello World !\n");
   return;
}

2)新建Android.mk文件
在jni目录下(即hello-jni.c 同级目录下)新建一个Android.mk文件
LOCAL_PATH := $(call my-dir)
include  $(CLEAR_VARS)
LOCAL_MODULE    := hello
#LOCAL_MODULE,编译的目标对象,以标识你在Android.mk文件中描述的每个模块
LOCAL_SRC_FILES := hello.c
#LOCAL_SRC_FILES变量必须包含将要编译打包进模块中的C或C++源代码文件
include  $(BUILD_SHARED_LIBRARY)
#BUILD_SHARED_LIBRARY表示编译生成共享库

运行cygwin, 到C++工程目录下,如下:
cd cygdrive/c/workspace/hello/src/jni
运行$NDK/ndk-build,如下:
$ ndk-build
Cygwin         : Generating dependency file converter script
Compile thumb  : hello <= hello.c
SharedLibrary  : libhello.so
Install        : libhello.so => libs/armeabi/libhello.so
如果提示信息如上所示,表示.so共享库文件成功生成

so文件拷贝到java的加载库LD_LIBRARY_PATH指向的路径中。

5,运行java工程

出处:htpp://blog.sina.com.cn/staratsky

cygwin+ndk+eclipse下JNI技术入门,布布扣,bubuko.com

时间: 2024-11-03 21:06:43

cygwin+ndk+eclipse下JNI技术入门的相关文章

11.Cocos2dx2.2下使用JNI技术调用jar包里面的一些方法遇到的一些问题及解决方案。

<span style="font-family: Arial, Helvetica, sans-serif;">步骤一:导入JniHelper.h头文件.</span> #if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) #include "JniHelper.h" #endif: 此时会遇到JniHelper.h头文件无法找到的问题,需要添加附加包含目录即可解决问题.具体操作步骤如下:右击项目-

Eclipse下用NDK编译生成so文件

我们在安装环境的时候安装了NDK,可以在eclipse下直接生成so文件.NDK的压缩包里面自带了一些sample工程,NDK的文件直接解压到某个目录下即可. 第一次生成so文件的时候,我们先使用NDK的sample下的hello-jni的例子. 1.启动eclipse,通过Create project  from existing source,选择hello-jni的目录,按默认选项创建工程即可: 2.观察hello-jni的工程目录结构,发现根目录下多了一个名叫jni的文件夹,该文件夹下面

eclipse下使用cygwin的方法(Windows下用eclipse玩gcc/g++和gdb)

明天就回国了,今晚回国前写写如何配置eclipse和CDT.这个配置方法网上讨论不是很多,可能用的人少,毕竟Windows上写C++程序多数喜欢VS,即使写的是Linux程序,很多人仍然会用VS(说只喜欢用VI的人我佩服).的确VS很强大,但我也geek一回,使用eclipse做C++程序(用VI才是真正的geek?好吧,我就这水准了,反正我会用VI,但不习惯VI).希望这篇小小的文章能帮助想在Windows平台上使用gcc/g++和gdb并利用IDE调试程序的人.也希望我们谈到g++和gcc的

Spring学习随笔(2):Eclipse下Spring环境配置+入门项目

1 准备工作 (按需下载) Eclipse 下载:http://www.eclipse.org/downloads/eclipse-packages/ : Spring 下载:http://repo.spring.io/libs-release-local/org/springframework/spring/  版本自选: Spring aop另需的3个包:http://download.csdn.net/download/lk_lxn/6397895 2 Spring IDE help->E

Android jni 编程入门

本文将介绍如何使用eclipse和ndk-build来编写一个基于Android4.4版本的包含有.so动态库的安卓程序. 前提是已经安装和配置好了诸如SDK,NDK等编译环境.下面开始编程! 1 程序逻辑 我们要编写的程序包含两部分:java部分--负责界面和调用JNI native函数:JNI native 部分--负责native函数的具体实现(本文使用C语言). native 函数伪代码如下: ? 1 2 3 4 5 6 7 8 /* funtion: 传入两个整形变量,计算他们之和 r

使用jni技术进行android应用签名信息核查及敏感信息保护

最近业余时间写了一款应用<摇啊摇>,安智.安卓.360等几个应用商店已经陆续审核通过并上线.从有想法到最终将产品做出来并发布,断断续续花了近二个半月的业余时间,总体来讲还算顺利,虽然期间也遇到几个小技术难点,最后解决的还算满意.今天说下其中一个小技术难点,现在想想这个小技术难点也很平常,但还是分享出来,希望对有相同疑惑的同学有帮助. 因为java语言自身特性的原因,导致android程序很容易被反编译,虽然可以采用代码混淆的方式,但是如果用了第三方库,混淆脚步编写不好,代码混淆后又会出现程序运

在Eclipse下搭建Android开发环境教程

我们昨天向各位介绍了<在NetBeans上搭建Android SDK环境>,前不久也介绍过<在MyEclipse 8.6上搭建Android开发环境>, 都受到了读者的欢迎.但是很多朋友都认为NetBeans在中国用户不多,MyEclipse又是收费产品,都没有Eclipse好,很多读者都希望我们 介绍一下Eclipse下搭建的Android开发环境,本文将全程演示Android开发环境的搭建过程,无需配置环境变量.所有软件都是写该文章时最 新版本,希望大家喜欢. 一 相关下载 (

《SaltStack技术入门与实践》—— 实践案例 &lt;中小型Web架构&gt;3 Memcached配置管理

实践案例 <中小型Web架构>3 Memcached配置管理 本章节参考<SaltStack技术入门与实践>,感谢该书作者: 刘继伟.沈灿.赵舜东 Memcached介绍 Memcached是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态数据库驱动网站的访问速度.Memcached基于一个存储键/值对的hashmap.其守护进程(daemon )是用C写的,但是客户端可以用任何语言来编写,并通

[Gradle] 在 Eclipse 下利用 gradle 构建系统

转载自:http://www.ibm.com/developerworks/cn/opensource/os-cn-gradle/ 构建系统时候常常要用到 Ant, Maven 等工具,对于初学者来说,它们还是过于复杂,上手还是需要时间的.本文将向读者介绍一种全新的构建项目的方式 gradle,它简单.上手快,能大大节省项目的时间和成本. 在 eclipse 下利用 gradle 构建系统 基本开发环境 操作系统:本教程使用的为 Windows Vista Enterprise, 如果您的系统是