linux eclipse android NDK+JNI 本地共享链接库开发笔记。。------记录一下,不然过段时间就忘了

  小弟不才,网上查了很多资料才把第一个共享链接库写出来并测试成功。。。
 
  一. 首先当然是配置开发环境
   android的开发环境此处不多说,见另一博文: Android开发环境搭建
  下面说一下NDK环境搭建:下载NDK,目前版本为 android-ndk-r8b ,点击下面链接即可下载
     http://dl.google.com/android/ndk/android-ndk-r8b-linux-x86.tar.bz2
NDK是不需要安装的,但是要配置以下环境变量:
  $vi /etc/profile,在后面添加如下环境变量:
PATH=$PATH:$HOME/bin:/usr/local/android-ndk-r8b  《===这里是NDK所在的目录
NDKROOT=/usr/local/android-ndk-r8b   《===这里是NDK所在的目录
export PATH
export PATH NDKROOT
重启机器,终端输入:ndk-build,如果出现如下信息说明环境变量设置成功;
[root@fedora ~]# ndk-build
Android NDK: Could not find application project directory !   
Android NDK: Please define the NDK_PROJECT_PATH variable to point to it.   
/usr/local/android-ndk-r5b/build/core/build-local.mk:85: *** Android NDK: Aborting    。 停止。
如果出现ndk-build not found,重新设置。。

二. 下面开始编写工程,以一个例子讲述开发过程

  1.新建工程,编写Activity类,其实这里又两种方法:
  方法一:将本地方法声明和链接库的装载放到主Activity 里面,如下
package cc.ndk_jni_example;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.TextView;
public class NDKJNI extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
       
        TextView tv = (TextView) findViewById(R.id.tv);
        tv.setText(stringFromJNI());
    }
   
    public native String stringFromJNI();
   
    static
    {
        System.loadLibrary("NDKJNI");
    }
}
这种方法如何来编译生成class文件呢?当然是用javac来编译,只不过需要用到第三方的即android的jar包,命令如下:
[root@fedora NDK_JNI_example]# 
javac -classpath /usr/local/android-sdk-linux/platforms/android-7/android.jar
   
         -d bin gen/cc/ndk_jni_example/*.java src/cc/ndk_jni_example/NDKJNI.java

 -classpath指明需用到的第三方包
 -d指明生成的class文件的存放目录
 需要用到R.class,所以将gen目录下的java文件一起编译,之后就会在bin目录下生成相应的class文件。。

方法二:将本地方法声明和链接库加载放到单独的一个java类中,只需在主activity中新建该类的对象即可调用,编译过程和java的编译过程一样。。

其实这一步完全没必要做,即编译这一步不需要做,新建一个工程之后,写完java文件保存之后,eclipse自动帮你编译生成 class文件,放在bin/classes目录下,不信你看以下bin目录下你所生成的类和bin/classes目录下的类是否一样。。。

2.生成.h头文件( 如果对JNI编程比较熟悉且对函数命名比较熟的话可以跳过这一步,直接编写c文件

根据生成的class文件来生成c的头文件,然后进入目录bin/classes,运行 javah -d ../jni/ -classpath . cc.ndk_jni_example.NDKJNI
    -d <目录>             输出目录
   -classpath <路径>     用于装入类的路径, . 表示当前路径
然后刷新一下工程就可以看到多出jni文件夹,文件夹包含.h头文件
linux eclipse android NDK+JNI 本地共享链接库开发笔记。。------记录一下,不然过段时间就忘了_第1张图片

3.编写c文件,以及Android.mk
NDKJNI.c文件如下

#include
#include

JNIEXPORT jstring JNICALL Java_cc_ndk_1jni_1example_NDKJNI_stringFromJNI
( JNIEnv* env,jobject thiz )
{
    return (*env)->NewStringUTF(env, "Hello from JNI !");
}
Android.mk文件如下;
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := NDKJNI
LOCAL_SRC_FILES := NDKJNI.c

include $(BUILD_SHARED_LIBRARY)
然后进入主目录,运行ndk-build,ok生成.so库了

工程目录结构如下:
linux eclipse android NDK+JNI 本地共享链接库开发笔记。。------记录一下,不然过段时间就忘了_第2张图片


点击运行,结果如下:
linux eclipse android NDK+JNI 本地共享链接库开发笔记。。------记录一下,不然过段时间就忘了_第3张图片

同文新浪微博地址(我的博客): http://blog.sina.com.cn/u/2034036587

你可能感兴趣的:(linux eclipse android NDK+JNI 本地共享链接库开发笔记。。------记录一下,不然过段时间就忘了)