android之JNI开发步骤总结
2014-01-20 22:35
591 查看
这几天一直在研究JNI的开发过程,顺便把NDK环境搭建一起总结下。在windows环境下开发jni需要c/c++编译器的支持,网络上我看很多人使用cygwin。呵呵我不是很喜欢使用它,感觉安装起来挺麻烦的。我使用GNUStep,下载地址http://www.gnustep.org/experience/Windows.html。
下载安装后,验证是否成功。打开GNUstep->Shell,输入make -v 和 gcc -v命令,如图所示。
下载NDK,地址http://developer.android.com/tools/sdk/ndk/index.html。下载完后解压即可。
配置ndk环境变量,gnustep是模拟linux的环境的,打开gnustep的安装目录下的G:\softinstall\GNUstep\GNUstep\GNUstep.conf文件,添加以下内容:
复制内容到剪贴板
代码:
说明如果不知道ndk目录在linux下应该是在哪里,你可以打开gnustep的命令窗口,输入mount,就可以找到对应的盘符。
验证环境变量,如下图。
以上就配置成功了。
下载进入正题啦。Jni的开发步骤。
打开eclipse,新建工程名为testJni。在activity中添加以下代码
复制内容到剪贴板
代码:
编译后的文件在bin目录下,通过javah命令生成c/c++的文件头。如下图
会在项目目录下生成jni/com_xzw_jni_TestJni.h。
头文件代码如下:
复制内容到剪贴板
代码:
这里我们可以根据头文件编写c代码
复制内容到剪贴板
代码:
接下来编写 Android.mk,该文件可以直接从NDK的samples下的hello-jni的jni文件下直接靠过来改改就可以了。也贴下代码哈。
复制内容到剪贴板
代码:
其中你只需要该LOCAL_MODULE和LOCAL_SRC_FILES就可以了。
说明:LOCAL_MODULE是描述模块的,用来给java调用的模块名,会生成对应的libtestJni.so
LOCAL_SRC_FILES就是源文件啦,多个文件空格隔开即可。
接下来,我们要开始编译生成so文件咯。
打开gnustep的命令窗口,进入到项目底下,输入$NDK/ndk-build命令,即可自动生成libs/armeabi/libtestJni.so文件。
接下来就是java调用了。直接上代码
复制内容到剪贴板
代码:
运行结果如下
以上就是jni的开发步骤了。
在这里我还要补充下:
在我们开发过程中,改一个c/c++的文件,我们都要手动去编译一下有点儿麻烦。这里我们可以使用让eclipse帮助我们自己编译。
右击jni工程的properties-->Builders-->NEW -->;Program 可以看到以下内容:
argument:--login -c "cd /e/myWorkSpace/android/hellJni && $NDK/ndk-build"
切换到Refresh 标签页
切换到Build Options标签页
这样就完成了配置,点击确定可看到控制台自动编译程序了
能力有限,请大家多多指教。附上源码
hellJni.rar (682.35
KB) 。欢迎关注我的博客: http://home.51cto.com/index.php?s=/space/978424
下载安装后,验证是否成功。打开GNUstep->Shell,输入make -v 和 gcc -v命令,如图所示。
下载NDK,地址http://developer.android.com/tools/sdk/ndk/index.html。下载完后解压即可。
配置ndk环境变量,gnustep是模拟linux的环境的,打开gnustep的安装目录下的G:\softinstall\GNUstep\GNUstep\GNUstep.conf文件,添加以下内容:
复制内容到剪贴板
代码:
NDK=/g/softinstall/Android/android-ndk-r8b export=NDK
说明如果不知道ndk目录在linux下应该是在哪里,你可以打开gnustep的命令窗口,输入mount,就可以找到对应的盘符。
验证环境变量,如下图。
以上就配置成功了。
下载进入正题啦。Jni的开发步骤。
打开eclipse,新建工程名为testJni。在activity中添加以下代码
复制内容到剪贴板
代码:
package com.xzw.jni; import android.os.Bundle; import android.app.Activity; import android.view.Menu; import android.view.MenuItem; import android.widget.TextView; import android.support.v4.app.NavUtils; /** * * @author XuZhiwei (xuzhiwei@gmail.com) * sina:http://weibo.com/xzw1989 * * Create at 2012-8-30 上午10:49:45 */ public class TestJni extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } //natvie必须声明,用于生成C/C++代码 public native String hello(); static{ System.loadLibrary("testJni"); } }
编译后的文件在bin目录下,通过javah命令生成c/c++的文件头。如下图
会在项目目录下生成jni/com_xzw_jni_TestJni.h。
头文件代码如下:
复制内容到剪贴板
代码:
/* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class com_xzw_jni_TestJni */ #ifndef _Included_com_xzw_jni_TestJni #define _Included_com_xzw_jni_TestJni #ifdef __cplusplus extern "C" { #endif /* * Class: com_xzw_jni_TestJni * Method: hello * Signature: ()Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_com_xzw_jni_TestJni_hello (JNIEnv *, jobject); #ifdef __cplusplus } #endif #endif
这里我们可以根据头文件编写c代码
复制内容到剪贴板
代码:
#include <string.h> #include <jni.h> jstring Java_com_xzw_jni_TestJni_hello (JNIEnv* env, jobject thiz){ return (*env)->NewStringUTF(env, "哈哈完成自动化编译 !"); }
接下来编写 Android.mk,该文件可以直接从NDK的samples下的hello-jni的jni文件下直接靠过来改改就可以了。也贴下代码哈。
复制内容到剪贴板
代码:
# 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 := testJni LOCAL_SRC_FILES := testJni.c include $(BUILD_SHARED_LIBRARY)
其中你只需要该LOCAL_MODULE和LOCAL_SRC_FILES就可以了。
说明:LOCAL_MODULE是描述模块的,用来给java调用的模块名,会生成对应的libtestJni.so
LOCAL_SRC_FILES就是源文件啦,多个文件空格隔开即可。
接下来,我们要开始编译生成so文件咯。
打开gnustep的命令窗口,进入到项目底下,输入$NDK/ndk-build命令,即可自动生成libs/armeabi/libtestJni.so文件。
接下来就是java调用了。直接上代码
复制内容到剪贴板
代码:
package com.xzw.jni; import android.os.Bundle; import android.app.Activity; import android.view.Menu; import android.view.MenuItem; import android.widget.TextView; import android.support.v4.app.NavUtils; /** * * @author XuZhiwei (xuzhiwei@gmail.com) * sina:http://weibo.com/xzw1989 * * Create at 2012-8-30 上午10:49:45 */ public class TestJni extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); TextView tv = new TextView(this); tv.setText(hello()); //这里的hello() 就是调用c setContentView(tv); } public native String hello(); static{ System.loadLibrary("testJni"); } }
运行结果如下
以上就是jni的开发步骤了。
在这里我还要补充下:
在我们开发过程中,改一个c/c++的文件,我们都要手动去编译一下有点儿麻烦。这里我们可以使用让eclipse帮助我们自己编译。
右击jni工程的properties-->Builders-->NEW -->;Program 可以看到以下内容:
argument:--login -c "cd /e/myWorkSpace/android/hellJni && $NDK/ndk-build"
切换到Refresh 标签页
切换到Build Options标签页
这样就完成了配置,点击确定可看到控制台自动编译程序了
能力有限,请大家多多指教。附上源码
hellJni.rar (682.35
KB) 。欢迎关注我的博客: http://home.51cto.com/index.php?s=/space/978424
相关文章推荐
- android报错——findViewById报错
- android应用版本适配
- 85 Android ListView 和 ScrollView 事件冲突
- Android整理
- 在Android的Listview中显示多种视图
- Android中实现多控件监听
- Android开发之ListView,Gallery,GridView等图片性能优化
- 我是如何从0开始,在23天里完成一款Android游戏开发的 – Part 1 – 开篇与前2天
- Android应用换肤
- Android优化浅谈之Java代码优化
- android 循环播放图片实现
- android端口占用问题
- Android权限解释
- android 相对布局里面的一些属性
- Android 音乐播放器的实现(三)Service的实现
- android图片高斯模糊的方法
- android AlarmManager
- USB Camera在android车机上应用前景及初试小结
- Android中dip、dp、sp、pt和px的区别
- Android 类似PC下拉框Spinner