`
mfcai
  • 浏览: 404476 次
  • 性别: 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是下载到本地然后安装的,...

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

    本文档根据网上的学习资料和本人的亲身实践,详细讲解了在windows系统平台下如何配置ndk的过程。 1、安装cygwin 2、下载ndk 3、ndk和cygwin的配置 4、下载安装eclipse插件cdt 5、ndk与eclipse的集成 6、运行实例...

    windows编译Jni(无需Cygwin)

    实现在Win7 环境下,用Eclipse+ndk-windows 来编译so,抛掉繁琐的Cygwin工具。

    android-jni-ndk

    windows下eclipse集成cygwin编译android_NDK(即结合jni调用c-c++).doc

    Windows下Eclipse搭建Android_NDK开发环境

    Windows下Eclipse搭建Android_NDK开发环境,开发过程中用到了JNI,必然要牵扯到NDK开发环境的搭建。也就是安装Cygwin的过程。相信按照文档你能够完成任务。因为搭建环境如果不认真的话,你可能还真的搭不成功哈~~~

    cocos2d-1.0.1-x-0.13.0-beta--android-ndk-windows构建批处理.zip

    注2:此批处理可以脱离Eclipse,只用NDK自带的编译器即可,这里只用来编译库,如果要打包到APK还是需要Eclipse的,将刚刚编译的库导入即可 上面讲解了两种方法,自行选择 build_android_ndk.bat 需要在开始 --&...

    pro_android_cpp_with_the_ndk.pdf

    第1章 Android平台上的C++入门 1.1 Microsoft Windows 1.1.1 在Windows平台上下载并安装JDK开发包 1.1.2 在Windows平台上下载并安装ApacheANT 1.1.3 在Windows平台上下载并安装AndroidSDK 1.1.4 在Windows平台上下载...

    高焕堂<应用框架原理与程序设计>源代码(Eclipse)

    Windows下编译.so文件步骤(这里我使用NDK(android-ndk-1.6_r1)加Cygwin 在windows下编译,如果没有请安装, 注:android-ndk-1.6_r1只支持android 1.6或更早版本,所以这里必须将你的android工程的Target设为1.6): ...

    Android C++高级编程:使用NDK_Onur Cinar, 于红PDF电子书下载 带书签目录 完整版

    Android C++高级编程:使用NDK_Onur Cinar, 于红PDF电子书下载 带书签目录 完整版 原书名:Pro Android C++ with the NDK 原出版社: Apress 作者: (美)Onur Cinar 译者: 于红 佘建伟 冯艳红 丛书名: 移动开发...

Global site tag (gtag.js) - Google Analytics