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
分享到:
相关推荐
后来结合网上说的让后加上自己摸索,终于可以用eclipse + NDK + Cygwin编译出so文件并且能够直接运行helloJNI程序了,现在把我的经验和大家分享,希望对大家有帮助。(想起来了,我的Cygwin是下载到本地然后安装的,...
在Windows环境下进行Android原生代码开发,通常会涉及到Eclipse、Cygwin、CDT和NDK这四个组件。下面将详细介绍它们的功能以及如何配置。 首先,Eclipse是一款广泛使用的集成开发环境(IDE),尤其在Java开发领域。...
搭建Android+Eclipse+NDK+cygwin开发环境是Windows平台下进行Android原生代码(C/C++)开发的基础步骤。以下是对各个步骤的详细说明: 1. **安装JDK**: JDK (Java Development Kit) 是Java编程语言的开发环境,对于...
- 使用Eclipse的CDT工具编辑C/C++代码,并在Cygwin环境下通过NDK编译生成.so文件。 - 在Eclipse中构建和运行Android项目,此时Android应用将加载并执行.so文件中的代码。 通过以上步骤,开发者能够在Windows环境...
本文档将详细介绍如何在Eclipse中配置Android NDK开发环境,并实现C/C++代码的自动编译以及通过Eclipse使用Ant生成JNI所需的头文件。配置流程包括Linux和Windows两种环境下的步骤。 #### 二、配置前提 确保以下工具...
### Windows 下 Eclipse 集成 Cygwin 编译 Android NDK 在 Windows 环境下使用 Eclipse 开发 Android 应用时,如果需要利用 C 或 C++ 的功能,通常会涉及到 Android NDK 的使用。为了更好地整合开发流程,可以将 ...
【Eclipse下配置NDK不用安装Cygwin】的知识点主要集中在如何在Windows环境下使用NDK进行Android原生代码开发,以及如何在Eclipse中设置Builder以实现自动编译NDK项目,避免依赖Cygwin。 1. **NDK介绍**: - NDK...
现在,读者已经成功搭建了一个 JNI 开发环境,可以使用 Eclipse 和 CDT 插件来编写和编译 C/C++ 代码,并使用 NDK 和 Cygwin 来编译 JNI 代码。这个环境可以帮助读者更好地开发 JNI 项目,提高开发效率。
本文将详细介绍如何在Eclipse环境下配置和使用Android NDK与JNI进行原生开发的过程。 #### 二、准备工作 1. **Eclipse SDK 3.6.1**:包括必要的ADT(Android Development Tools)和CDT(C/C++ Development Tools)插件...
需要打开Eclipse的偏好设置,然后找到Android选项下的NDK设置,并指定NDK的解压目录。这一步是告诉Eclipse NDK的位置,以便它能正确识别NDK工具和库文件。 然后,创建一个新的Android工程,并通过Android Tools菜单...
3. 创建一个`jniLibs`目录在项目的`src/main`下,Eclipse会自动识别此目录为原生库的存放位置。 4. 编辑`Android.mk`和`Application.mk`文件,指定编译选项和库名。 5. 使用NDK的`ndk-build`命令编译C/C++代码,生成...
- 在早期版本如r7之前,Windows环境下的开发者需要安装Cygwin来支持NDK的编译过程。 - 从NDKr7开始,Google为Windows环境提供了`ndk-build.cmd`脚本,简化了编译流程,无需额外安装Cygwin。 #### 创建开发项目 -...
通过以上步骤,我们成功地在Windows环境下,使用Eclipse和NDK编译了JNI库,无需依赖Cygwin。这种方式简化了开发流程,提高了开发效率,同时也避免了因Cygwin环境带来的兼容性问题。在实际开发中,还可以考虑使用...
- **环境变量配置**:在Cygwin的安装目录下创建或编辑`.bash_profile`文件,设置NDK路径,例如`NDK=/cygdrive/e/android-ndk-r7 export NDK`。重启Cygwin后,验证NDK路径是否正确。 2. **使用NDK编译C/C++代码** ...