Android之JNI开发步骤总结

来源:互联网 发布:歌洛依淘宝旗舰店 编辑:程序博客网 时间:2024/06/05 04:50

本人淘宝小店:http://isem.taobao.com  主营化妆品微笑微笑微笑
希望大家能进去看看,万分感谢

这几天一直在研究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:softinstallGNUstepGNUstepGNUstep.conf文件,添加以下内容:

NDK=/g/softinstall/Android/android-ndk-r8b

export=NDK

说明如果不知道ndk目录在linux下应该是在哪里,你可以打开gnustep的命令窗口,输入mount,就可以找到对应的盘符。

验证环境变量,如下图。

以上就配置成功了。

下载进入正题啦。Jni的开发步骤。

打开eclipse,新建工程名为testJni。在activity中添加以下代码

双击代码全选
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
packagecom.xzw.jni;   
         
importandroid.os.Bundle;   
importandroid.app.Activity;   
importandroid.view.Menu;   
importandroid.view.MenuItem;   
importandroid.widget.TextView;   
importandroid.support.v4.app.NavUtils;   
/**   
 *    
 * @author XuZhiwei (xuzhiwei@gmail.com)   
 * sina:http://weibo.com/xzw1989   
 *    
 * Create at 2012-8-30 上午10:49:45   
 */
publicclassMainActivity extendsActivity {    
    @Override
    publicvoidonCreate(Bundle savedInstanceState) {   
        super.onCreate(savedInstanceState);    
    }   
         
    publicnativeString hello();   
            
    static{   
        System.loadLibrary("testJni");   
    }   
             
}

编译后的文件在bin目录下,通过javah命令生成c/c++的文件头。如下图  

会在项目目录下生成jni/com_xzw_jni_TestJni.h。

头文件代码如下:

双击代码全选
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/* 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代码

双击代码全选
1
2
3
4
5
6
7
8
#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文件下直接靠过来改改就可以了。也贴下代码哈。

双击代码全选
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# Copyright (C) 2009The Android Open Source Project   
#   
# Licensed under the Apache License, Version 2.0(the"License");   
# you may not use thisfile 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 forthe 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调用来。直接上代码

双击代码全选
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
packagecom.xzw.jni;   
         
importandroid.os.Bundle;   
importandroid.app.Activity;   
importandroid.view.Menu;   
importandroid.view.MenuItem;   
importandroid.widget.TextView;   
importandroid.support.v4.app.NavUtils;   
/**   
 *    
 * @author XuZhiwei (xuzhiwei@gmail.com)   
 * sina:http://weibo.com/xzw1989   
 *    
 * Create at 2012-8-30 上午10:49:45   
 */
publicclassTestJni extendsActivity {    
    @Override
    publicvoidonCreate(Bundle savedInstanceState) {   
        super.onCreate(savedInstanceState);   
        TextView tv = newTextView(this);   
        tv.setText(hello());   
        setContentView(tv);   
    }   
         
    publicnativeString hello();   
            
    static{   
        System.loadLibrary("testJni");   
    }   
             
}

运行结果如下

本文出自 “Mr.Xu” 博客,请务必保留此出处http://xuzhiwei.blog.51cto.com/978424/976839