Android JNI使用及封装

hwuyule 贡献于2013-11-20

作者 Tian  创建于2011-09-13 03:13:00   修改者Demon  修改于2013-06-01 03:04:00字数3388

文档摘要:Android JNI使用及封装
关键词:

有任何疑问及问题请与QQ:372459530联系。 Android JNI使用及封装 一、 环境搭建 1. 在Android官方网站下载android-ndk: http://developer.android.com/tools/sdk/ndk/index.html。下载windows或者linux版本。由于需要反复传文件,建议在windows环境下搭建。下面介绍windows搭建。将下载的ndk解压,其中的文件不能在windows下运行。 2、在windows下,需要下载Cygwin模拟linux运行环境(NDK需要在linux环境中运行). http://cygwin.com/install.html. 点击下载安装到任意盘符(这里我安装在D盘) 3、安装Cygwin后,设置相应环境变量。设置后,检查配置是否成功。 D:\cygwin 此为linux模拟开发环境,可以使用各种linux命令。 4、配置.bash_profile文件。 找到Cygwin\home\Administrator文件,使用nodepad++或者UltraEdit打开.在最后一行添加:NDK=/cygdrive/D/android-ndk-r8b export NDK 我的 :NDK=/cygdrive/F/NDK/android-ndk-r8e export NDK 有任何疑问及问题请与QQ:372459530联系。 Ps:其中/D/android-ndk-r8b,为ndk目录。 (此为配置linux下配置ndk系统变量,在linux下可以如同配置。)如果找不到.bash_profile文件,删除HOME环境变量。重新运行Cygwin,再编辑.bash_profile文件。 二、 实例。 使用C语言编写helloworld返回”Hellow world”字符串,在java界面中显示。 1. 新建Hello工程。(略) 2. Activity 中代码: package com.example.hello; import android.os.Bundle; public class MainActivity extends Activity { //新建一个TextView private TextView tv = null; /* *JNI接口声明 */ static { //载入库函数Hello_c System.loadLibrary("Hello_c"); } //声明使用库中的函数,使用public native static 修饰, //调用函数为:String GetString(); public native static String GetString(); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tv = (TextView)super.findViewById(R.id.tv1); //调用函数,返回"Hello world"字符串并置于TextView中显示 tv.setText(GetString()); } @Override public boolean onCreateOptionsMenu(Menu menu) { 有任何疑问及问题请与QQ:372459530联系。 getMenuInflater().inflate(R.menu.activity_main, menu); return true; } } 3. 编译生成头文件: 1>进入Hello 工程所在文件.这里我保存在D:\android_dvp\Hello 2> javah -classpath D:/android-sdk-windows/platforms/android-10/android.jar;bin/classes -d jni com.example.hello.MainActivity Ps:我的android-sdk放在d:盘,此时用的是2.33的操作系统,API使用的是10,如果不是,更改: /android-sdk-windows/platforms/android-10/android.jar为/android-sdk-windows/platforms/xxxxxxxxxx/android.jar所对应的API版本。 我的::: javah -classpath E:/ sdk /platforms/android-10/android.jar;bin/classes -d jni com.example.helloworld.MainActivity 注:javah是C文件生成器 代码中:package com.example.hello;包名 MainActivity 为调用JNI接口的类名。 编译结果: 有任何疑问及问题请与QQ:372459530联系。 4、此时,在Hello 工程文件下会多出一个文件,名为:jni。 打开文件夹,此时有名为:com_example_hello_MainActivity.h头文件。 Ps:这个头文件的内容为自动生成,不要手动去修改。 打开这个头文件,复制声明的函数: JNIEXPORT jstring JNICALL Java_com_example_hello_MainActivity_GetString (JNIEnv *, jclass); 5、在jni文件夹下,新建一个名为Hello_c.c的文件,包含该头文件,添加如下代码: #include "com_example_hello_MainActivity.h" #include JNIEXPORT jstring JNICALL Java_com_example_hello_MainActivity_GetString (JNIEnv *env, jclass j_class) { //返回一个字符串.具体参照java-c JNI变量对应转换 return (*env)->NewStringUTF(env, "Hello World"); } 6、在jni文件夹下,编写Android.mk文件: LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) 有任何疑问及问题请与QQ:372459530联系。 LOCAL_SRC_FILES:= Hello_c.c //源文件 LOCAL_C_INCLUDES := /$(JNI_H_INCLUDE) LOCAL_SHARED_LIBRARIEsS := libutils LOCAL_PRELINK_MODULE := false //预链接 LOCAL_MODULE := Hello_c //生成的目标文件 include $(BUILD_SHARED_LIBRARY)//动态库 这里,我们一般只关注这2个地方(修改这2个地方即可) LOCAL_SRC_FILES源文件:Hello_c.c LOCAL_MODULE生成的目标模块:Hello_c (这个必须与java中System.load(“Hello_c”)相同),实际这个库文件全名为:libHello_c.so文件。 7、编译生成库文件。 Ps:在Cygwin中,windows的盘符映射: C:盘->/cygdrive/c,其余盘符一次类推。 进入到Hello工程文件下,使用$NDK/ndk-build编译生成libHello_c.so文件。 Ps:若这里编译没有通过,会报.c源文件中的错误信息。 现在可以在目录下找到编译生成的库文件。 至此,编译已经结束。 Ps:注意区别上述2个命令框,一个是Cygwin(带绿色字样),一个是dos窗口 三、使用虚拟机调试: 首先,进入android-sdk/platform-tools目录下。 有任何疑问及问题请与QQ:372459530联系。 我的SDK目录在E:/sdk/platform-tools ,然后查看在线虚拟机: 之后如图调用命令: 将.so文件复制到/system/lib: Ps:虚拟机重启后,装入的.so文件会丢失。需要重新复制到/system/lib中。 Adb push .so(完成路径) /system/lib Eg: adb push D:\android_dvp\Hello\libs\armeabi\libHello_c.so /system/lib 运行结果: 有任何疑问及问题请与QQ:372459530联系。 Ps:若将应用程封装成.apk文件在手机或者平板上安装,由于工程会将.so文件导入,不需要将.so文件导入/system/lib中(导入需要root权限)。但这个库文件只能被此应用程序调用,若其他程序需要调用,则需要导入/system/lib文件中。 有任何疑问及问题请与QQ:372459530联系。

下载文档到电脑,查找使用更方便

文档的实际排版效果,会与网站的显示效果略有不同!!

需要 5 金币 [ 分享文档获得金币 ] 0 人已下载

下载文档