JNI_NDK调用C语言

来源:互联网 发布:小商店记账软件 编辑:程序博客网 时间:2024/06/01 23:48
  1. 在Eclipse中创建项目:TestJNI                                                    
  2. 新创建一个class:TestJNI.java
    packagecom.xiaowenzi.xiaojni;
    publicclassTestJNI {
       publicnative boolean Init();
       publicnative int Add(intx,int y);
       publicnative void Destory();
       publicstatic void main(String[] args) {
            System.out.println("123456789");
        }
    }创建完之后执行一遍!生成相应的class文件.
  3. 生成C语言头文件(cmd操作)
        C:\Users\Administrator>D:
      D:\>cd Users\Administrator\androidworkspace\XiaoJNI\src
         javah
        -classpath D:\Users\Administrator\androidworkspace\XiaoJNI\bin\classes
        -d D:\Users\Administrator\androidworkspace\XiaoJNI\bin\classes
        -jni com.xiaowenzi.xiaojni.TestJNI

          javah中各个命令的意思是
     -classpath <路径> 用于装入类的路径
          -d <目录> 输出目录
          -jni 生成 JNI样式的头文件(默认)

     执行javah命令之后, 会在D:\Users\Adminis idworkspace\XiaoJNI\bin\classes目录下生成头文件:com_xiaowenzi_xiaojni_TestJNI.h, 将它复制到jni文件夹下,打开如下:
           /* DO NOT EDIT THIS FILE - it is machine generated */
            #include <jni.h>/* Header for class com_xiaowenzi_xiaojni_TestJNI */
            #ifndef _Included_com_xiaowenzi_xiaojni_TestJNI
            #define _Included_com_xiaowenzi_xiaojni_TestJNI
            #ifdef __cplusplus
            extern "C" {
               #endif
               /*
                * Class:     com_xiaowenzi_xiaojni_TestJNI
                * Method:    Init
                * Signature: ()Z
                */
               JNIEXPORT jboolean JNICALL Java_com_xiaowenzi_xiaojni_TestJNI_Init
                 (JNIEnv *, jobject);

               /*
                * Class:     com_xiaowenzi_xiaojni_TestJNI
                * Method:    Add
                * Signature: (II)I
                */
               JNIEXPORT jint JNICALL Java_com_xiaowenzi_xiaojni_TestJNI_Add
                 (JNIEnv *, jobject, jint, jint);

               /*
                * Class:     com_xiaowenzi_xiaojni_TestJNI
                * Method:    Destory
                * Signature: ()V
                */
               JNIEXPORT void JNICALL Java_com_xiaowenzi_xiaojni_TestJNI_Destory
                 (JNIEnv *, jobject);

               #ifdef __cplusplus
           }
           #endif
           #endif
  1. 使用C/C++实现JNI
    在jni文件夹下,创建com_xiaowenzi_xiaojni_TestJNI.cpp.h对应的cpp文件:com_xiaowenzi_xiaojni_TestJNI.cpp
    再添加两个文件Add.h, Add.cpp,具体实现放在这两个文件中来完成。                                                                                                           Add.h  
    #ifndef_TEST_JNI_ADD_H_
    #define_TEST_JNI_ADD_H_
    classCAdd{
    public:
       CAdd();
       ~CAdd();
       intAdd(intx,inty);
    };
    #endif                                                                                                                                                                Add.cpp(实现 Add.h里面的方法)
    #include"Add.h"
    CAdd::CAdd() {
    }
    CAdd::~CAdd() {
    }
    intCAdd::Add(intx,inty) {
       returnx + y;
    }                                                                                                    com_xiaowenzi_xiaojni_TestJNI.cpp(实现com_xiaowenzi_xiaojni_TestJNI.h的方法
    #include<stdio.h>
    #include<stdlib.h>
    #include"com_xiaowenzi_xiaojni_TestJNI.h"
    #include"Add.h"
    CAdd *pCAdd = NULL;
    JNIEXPORT jboolean JNICALLJava_com_xiaowenzi_xiaojni_TestJNI_Init(JNIEnv *env,
                jobject obj) {
          if(pCAdd == NULL) {
                pCAdd =newCAdd;
          }
          returnpCAdd != NULL;
    }
    JNIEXPORT jint JNICALLJava_com_xiaowenzi_xiaojni_TestJNI_Add(JNIEnv *env, jobject obj,
                jint x, jint y) {
          intres = -1;
          if(pCAdd != NULL) {
                res = pCAdd->Add(x, y);
          }
          returnres;
    }
    JNIEXPORTvoidJNICALL Java_com_xiaowenzi_xiaojni_TestJNI_Destory(JNIEnv *env, jobject obj){
          if(pCAdd != NULL){
                pCAdd = NULL;
          }
    }
  2. 创建mk文件,并使用ndk-build命令生成.so动态链接库文件                                                                                                                         在jni目录下创建Android.mk文件如下:
        LOCAL_PATH :=$(call my-dir)
        include$(CLEAR_VARS)
        TARGET_CPU_API := armeabi
        APP_ABI := armeabi
        LOCAL_MODULE := TestJNI
        LOCAL_SRC_FILES := com_xiaowenzi_xiaojni_TestJNI.cpp
        LOCAL_SRC_FILES += Add.cpp
        include$(BUILD_SHARED_LIBRARY)
       LOCAL_PATH是C/C++代码所在目录,也就是我们的jni目录。
       LOCAL_MODULE是要编译的库的名称。编译器会自动在前面加上lib,在后面加上.so。
       LOCAL_SRC_FILES是要编译的C/C++文件
      LOCAL_LDLIBS:= -ljnigraphics -llog 如果没用到BitMap不要添加。
    在jni目录下创建Application.mk文件:                                    
       APP_PROJECT_PATH :=$(call my-dir)/.. 
       APP_MODULES := TestJNI
       APP_ABI := armeabi    //(lib下的路径)
    用ndk来为我们生成相应的动态链接库了。
    首先需要下载NDK,并把NDK路径配置到path环境变量中去。(具体方法转:http://jingyan.baidu.com/article/574c52193c80fb6c8c9dc153.html)
    下载完成之后,进入Application.mk文件所在目录,在命令行中使用ndk-build生成.so文件。具体操作如下:
    在android 项目中配置编译器
      1 创建builer

      (a)Project->Properties->Builders->New,新建一个Builder。 

      (b)在弹出的【Choose configuration type】对话框,选择【Program】,点击【OK】: 

      (c)在弹出的【Edit Configuration】对话框中,配置选项卡【Main】。

               在“Name“中输入新builders的名称(我取名为Ndk_Builder)。
      (d)配置选项卡
           ------Main选项卡----------------  
      2在“Location”中输入nkd-build.cmd的路径。
     在“Working Diretcoty”中输入${workspace_loc:/HelloJni}(也可以点击“Browse Workspace”来选取  HelloJni目录)。

          --------Build Options选项卡-------

          勾选“After a “Clean””,

          勾选“During manual builds”,

          勾选“During auto builds”,

          勾选“Specify working set of relevant resources”。

     

          点击“Specify Resources…”
          勾选工程的“jni“目录里的Android.mk文件,点击”finish“。 
    3配置完成,Run 项目,在项目的libs文件夹中自动生成so文件
    6. 编译成功后会在工程目录的libs/armeabi目录下生成一个libTestJNI.so文件。              
1 0
原创粉丝点击