Android NDK & JNI

 
JNI是个什么东西
JNI: 是一种使得C/C++代码和java代码整合的机制,当然这已经在虚拟机里面已经实现好了。
我们什么时候需要JNI
就是在我们的Android程序中需要用C/C++来编写高效率的代码的时候。
我们如何使用JNI
//--------------------------------------------------------------------
在Window上用JNI的时候,我们需要以下的配置环境:
1、Android 的SDK开发环境( Eclipse + Android SDK + ADT + JDK)
2、Android 的NDK开发包( NDK在SDK开发文档里面可以找到 下载解压就行了)
3、Cygwin 环境 它在window上模拟了linux环境 ( http://www.cygwin.com/  下载setup.exe ) 这个安装需要些时间 
安装好Cygwin到默认路径之后 >> 配置下NDK的路径 >> 编辑这个文件( 例:C:/cygwin/home/lin.gao/.bash_profile  用UE打开就行)
在这个.bash_profile文件的最后面加上: ( 当然这个就是上面的NDK解压路径 )
NDK=/cygdrive/D/Andriod/android-ndk-r6  
export NDK
到此 我们的环境就已经搭建好了 >> 双击桌面的Cygwin >> 输入 $NDK >> 我们就进入了NDK 的路径下面 这里我们可以用一些linux命令 如 ls 、cd
//--------------------------------------------------------------------
接下来我们新建一个 Android 工程 Android_ScreenCapture     package   com.gl.Android_ScreenCapture   Level 8
1、在我们的工程里面新建一个 JNI.java 在这里就可以定义我们需要的接口 接口的数量 名字 参数都自拟  比如我们这里只是定义了一个 plus
JNI.java
package com.gl.Android_ScreenCapture;
public class JNI{
 public native int plus(int a,int b); // 这个就是 plus 接口      返回 a+b 
 
 static {
  System.loadLibrary("Android_ScreenCapture");
 }
}
我们上层java文件定义了接口 plus 那么我们需要一个下层的 .h 文件来实现与之对接 
//-------------------------------------------------------------------------
接下来我们根据上层定义的接口来生成一个相应的 .h 文件 实现 .c 文件 编辑 Android.mk
1、拷贝一个cmd.exe 到工程目录下面的 bin/ 
2、运行cmd.exe
3、执行 javah -classpath . -jni com.gl.Android_ScreenCapture.JNI
完成之后就会在 bin/ 下面生成 com_gl_Android_ScreenCapture_JNI.h 
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_gl_Android_ScreenCapture_JNI */
#ifndef _Included_com_gl_Android_ScreenCapture_JNI
#define _Included_com_gl_Android_ScreenCapture_JNI
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_gl_Android_ScreenCapture_JNI
 * Method:    plus
 * Signature: (II)I
 */
JNIEXPORT jint JNICALL Java_com_gl_Android_1ScreenCapture_JNI_plus
  (JNIEnv *, jobject, jint, jint);
#ifdef __cplusplus
}
#endif
#endif
为了工程的模块化 我们在 工程目录下建个文件夹 jni
4、拷贝 com_gl_Android_ScreenCapture_JNI.h 到 jni/
在 jni/ 中新建一个 com_gl_Android_ScreenCapture_JNI.c 文件来包含 com_gl_Android_ScreenCapture_JNI.h  并实现其接口
#include <jni.h>
#include "com_gl_Android_ScreenCapture_JNI.h"
JNIEXPORT jint JNICALL Java_com_gl_Android_1ScreenCapture_JNI_plus(JNIEnv *J, jobject obj, jint a, jint b){
 int ret = a+b; 
 return ret;
}
5、在 jni/ 生成 Android.mk 或者拷贝过来在编辑
# Copyright (C) 2009 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE    := Android_ScreenCapture
LOCAL_SERTIFICATE    := platform

LOCAL_SRC_FILES := com_gl_Android_ScreenCapture_JNI.c
include $(BUILD_SHARED_LIBRARY)
 
如果正常的话 现在编译是没有问题的
//---------------------------------------------------------------------------------------------------------------
到此为止 我们有了上层的java文件的定义  以及下层的 .c 和 .h 文件的支持 
接下来我们就生成 .so 库文件 以便上层的链接和调用
1、方便起见 拷贝我们的整个工程目录到 NDK 解压路径下的 samples/ 
2、运行Cygwin
3、执行 $NDK
       cd samples/Android_ScreenCapture/jni
       $NDK/ndk-build
编译成功之后 会在工程目录下生成 libs 和 obj 两个文件夹    libAndroid_ScreenCapture.so 就在 libs/armeabi/ 下
//---------------------------------------------------------------------------------------------------------------
到此为止 我们有了上层java文件的接口声明  下层有了 c 和 h 文件的定义与支持 中间也生成了用来链接的库文件 那么我们就可以实现真的调用了
1、编辑 Android_ScreenCapture.java 
package com.gl.Android_ScreenCapture;
import android.app.Activity;
import android.os.Bundle;
public class Android_ScreenCapture extends Activity {
    JNI j = new JNI();
    int res;
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    
        res = j.plus(1,1);
        // System.out.println(res); // 就会输出 1+1 的结果    
    }
   
}
 
到此为止 我们的JNI使用就结束了
//---------------------------------------------------------------------------------------------------------------
 
以上是个人的一个小总结 内容粗糙 还望大家批评指正 谢谢、、
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值