小弟不才,网上查了很多资料才把第一个共享链接库写出来并测试成功。。。
一. 首先当然是配置开发环境
android的开发环境此处不多说,见另一博文: Android开发环境搭建
下面说一下NDK环境搭建:下载NDK,目前版本为 android-ndk-r8b ,点击下面链接即可下载
http://dl.google.com/android/ndk/android-ndk-r8b-linux-x86.tar.bz2
NDK是不需要安装的,但是要配置以下环境变量:
$vi /etc/profile,在后面添加如下环境变量:
二. 下面开始编写工程,以一个例子讲述开发过程
1.新建工程,编写Activity类,其实这里又两种方法:
方法一:将本地方法声明和链接库的装载放到主Activity 里面,如下
[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头文件
3.编写c文件,以及Android.mk
NDKJNI.c文件如下
工程目录结构如下:
点击运行,结果如下:
同文新浪微博地址(我的博客): http://blog.sina.com.cn/u/2034036587
一. 首先当然是配置开发环境
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头文件
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库了
工程目录结构如下:
点击运行,结果如下:
同文新浪微博地址(我的博客): http://blog.sina.com.cn/u/2034036587