`
mfcai
  • 浏览: 410035 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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
分享到:
评论

相关推荐

    android eclipse+NDK+Cygwin编译JNI 教程

    后来结合网上说的让后加上自己摸索,终于可以用eclipse + NDK + Cygwin编译出so文件并且能够直接运行helloJNI程序了,现在把我的经验和大家分享,希望对大家有帮助。(想起来了,我的Cygwin是下载到本地然后安装的,...

    windows+eclipse+cygwin+cdt+ndk配置

    在Windows环境下进行Android原生代码开发,通常会涉及到Eclipse、Cygwin、CDT和NDK这四个组件。下面将详细介绍它们的功能以及如何配置。 首先,Eclipse是一款广泛使用的集成开发环境(IDE),尤其在Java开发领域。...

    Android+Eclipse+NDK+cygwin开发环境的搭建.doc

    搭建Android+Eclipse+NDK+cygwin开发环境是Windows平台下进行Android原生代码(C/C++)开发的基础步骤。以下是对各个步骤的详细说明: 1. **安装JDK**: JDK (Java Development Kit) 是Java编程语言的开发环境,对于...

    配置NDK集成eclipse使用hello-jni实例

    - 使用Eclipse的CDT工具编辑C/C++代码,并在Cygwin环境下通过NDK编译生成.so文件。 - 在Eclipse中构建和运行Android项目,此时Android应用将加载并执行.so文件中的代码。 通过以上步骤,开发者能够在Windows环境...

    非常强大的eclipse中android ndk开发环境的配置说明

    本文档将详细介绍如何在Eclipse中配置Android NDK开发环境,并实现C/C++代码的自动编译以及通过Eclipse使用Ant生成JNI所需的头文件。配置流程包括Linux和Windows两种环境下的步骤。 #### 二、配置前提 确保以下工具...

    windows下eclipse集成cygwin编译android_NDK

    ### Windows 下 Eclipse 集成 Cygwin 编译 Android NDK 在 Windows 环境下使用 Eclipse 开发 Android 应用时,如果需要利用 C 或 C++ 的功能,通常会涉及到 Android NDK 的使用。为了更好地整合开发流程,可以将 ...

    Eclipse下配置NDK不用安装Cygwin

    【Eclipse下配置NDK不用安装Cygwin】的知识点主要集中在如何在Windows环境下使用NDK进行Android原生代码开发,以及如何在Eclipse中设置Builder以实现自动编译NDK项目,避免依赖Cygwin。 1. **NDK介绍**: - NDK...

    JNI开发 eclipse相关开发环境的搭建

    现在,读者已经成功搭建了一个 JNI 开发环境,可以使用 Eclipse 和 CDT 插件来编写和编译 C/C++ 代码,并使用 NDK 和 Cygwin 来编译 JNI 代码。这个环境可以帮助读者更好地开发 JNI 项目,提高开发效率。

    Eclipse Android NDK JNI 详细开发流程

    本文将详细介绍如何在Eclipse环境下配置和使用Android NDK与JNI进行原生开发的过程。 #### 二、准备工作 1. **Eclipse SDK 3.6.1**:包括必要的ADT(Android Development Tools)和CDT(C/C++ Development Tools)插件...

    Eclipse配置NDK环境

    需要打开Eclipse的偏好设置,然后找到Android选项下的NDK设置,并指定NDK的解压目录。这一步是告诉Eclipse NDK的位置,以便它能正确识别NDK工具和库文件。 然后,创建一个新的Android工程,并通过Android Tools菜单...

    ECLIPSE下的androidndk开发

    3. 创建一个`jniLibs`目录在项目的`src/main`下,Eclipse会自动识别此目录为原生库的存放位置。 4. 编辑`Android.mk`和`Application.mk`文件,指定编译选项和库名。 5. 使用NDK的`ndk-build`命令编译C/C++代码,生成...

    Eclipse里Android JNI的开发方法

    - 在早期版本如r7之前,Windows环境下的开发者需要安装Cygwin来支持NDK的编译过程。 - 从NDKr7开始,Google为Windows环境提供了`ndk-build.cmd`脚本,简化了编译流程,无需额外安装Cygwin。 #### 创建开发项目 -...

    windows编译Jni(无需Cygwin)

    通过以上步骤,我们成功地在Windows环境下,使用Eclipse和NDK编译了JNI库,无需依赖Cygwin。这种方式简化了开发流程,提高了开发效率,同时也避免了因Cygwin环境带来的兼容性问题。在实际开发中,还可以考虑使用...

    Eclipse+CDT+GDB调试android NDK程序

    1. **创建项目**:在Eclipse中新建一个Android项目,选择“Create Project from Existing Source”,源代码路径设置为`/home/shaodx/android/android-ndk-r7/samples/hello-jni`。 - Sdk Target选择2.2(其他版本...

    eclipse完整编译NDK_sample代码

    - **环境变量配置**:在Cygwin的安装目录下创建或编辑`.bash_profile`文件,设置NDK路径,例如`NDK=/cygdrive/e/android-ndk-r7 export NDK`。重启Cygwin后,验证NDK路径是否正确。 2. **使用NDK编译C/C++代码** ...

Global site tag (gtag.js) - Google Analytics