两分钟搞定android JNI

鉴客 发布于 2011/12/10 10:55
阅读 4K+
收藏 15

关于什么是JNI,我想对于学习android的人一定不会陌生,如果实在不了解你可以GOOGLE一下,本人就不解释了。我今天主要想通过一个实例,让大家感受下它的使用。先介绍下我的一些开发环境和目的:

实例的开发环境:Eclipse +android ADT +windows xp+jdk 1.6.0.20+Vmware+Ubuntu 10.04 

实例的目的::android的java 应用使用JNI(Java Native Interface)调用 C/C++开发的共享库。

现在就跟着我的步骤一步步来实现:
(1)  Eclipse中新建 android工程 
        工程名:JNItest 
        Package名:com.ura.test 
        Activity名:JNItest 
        应用程序名:JNItest 

(2)编辑 main.xml 如下: 

            <?xml version="1.0" encoding="utf-8"?> 
                 <LinearLayout   xmlns:android="http://schemas.android.com/apk/res/android" 
                       android:orientation="vertical" 
                      android:layout_width="fill_parent" 
                      android:layout_height="fill_parent" 
                  > 
                <TextView   
                   android:id="@+id/JNITest" 
                   android:layout_width="fill_parent"  
                  android:layout_height="wrap_content"  
                  android:text="@string/JNITest" 
                 /> 
         </LinearLayout> 

(3)编辑 strings.xml 如下: 

             <?xml version="1.0" encoding="utf-8"?> 
              <resources> 
                      <string name="JNITest">Hello World, JNItest!</string> 
                      <string name="app_name">JNItest</string> 
              </resources> 

 4)编辑java文件

package com.ura.test;

 

importandroid.app.Activity;

import android.os.Bundle;

importandroid.widget.TextView;

public
class JNItest extends Activity {


/** Called whenthe activity is first created. */


static {

System.loadLibrary("JNITest");

}


public native static StringGetTest();


@Override

public
void onCreate(BundlesavedInstanceState) {

     super.onCreate(savedInstanceState);

     setContentView(R.layout.main);

     String str =GetTest();

     TextViewJNITest = (TextView)findViewById(R.id.JNITest);

     JNITest.setText(str);

      }

}

如下:

(5)进入工程的主目录下,然后用javah工具生成c/c++头文件。

将在主目录下生成jni文件夹

 

里面有个

头文件,内容如下:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_ura_test_JNItest */

#ifndef _Included_com_ura_test_JNItest
#define _Included_com_ura_test_JNItest
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class:     com_ura_test_JNItest
* Method:    GetTest
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_ura_test_JNItest_GetTest
  (JNIEnv *, jclass);

#ifdef __cplusplus
}
#endif
#endif
(6)在jni文件夹下编写c/c++文件如下
#include <stdio.h>
#include <stdlib.h>
#include <utils/Log.h>
#include "com_ura_test_JNItest.h"  

JNIEXPORT jstring JNICALL Java_com_ura_test_JNItest_GetTest
  (JNIEnv *env, jclass obj)
{
                LOGD("Hello LIB!/n");
    return (*env)->NewStringUTF(env, "JNITest Native String");
}

(7)在jni文件夹下编写android.mk文件

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES:= /
    com_ura_test_JNItest.c
LOCAL_C_INCLUDES := /
    $(JNI_H_INCLUDE)
LOCAL_SHARED_LIBRARIES := libutils
LOCAL_PRELINK_MODULE := false
LOCAL_MODULE := libJNITest
include $(BUILD_SHARED_LIBRARY)

(8)编译生成动态库
        在ubuntu的android源码下面新建文件夹
        ~/myandroid/external/libJNITest
        把上面jni文件夹下编写好的头文件,C/C++源文件,make文件拷贝进上面的目录中
        在ubuntu中执行
        Cd myandroid
        . ./build/envsetup.sh
        Cd external/libJNITest/
        mm
        如图:

编译成功的后会在下面目录中生成libJNITest.so文件~myandroid/out/target/product/generic/system/lib/

然后将libJNITest.so文件放入到windowsXPandroidSDK主目录下的tools文件夹下

9)在模拟器中执行程序

启动模拟器
进入SDK主目录下的tools文件夹
如下

输入adbdevices如下图后:

然后输入adb remount如下图:

然后输入adb push libJNITest.so /system/lib

如果成功了就可以看到

10)然后运行程序

Eclipse下的JNITest工程(注明:上面开的模拟器不要关闭,关掉再开动态库就没有了,模拟器的system是只读的)

运行效果如图:

 

文章出处:http://blog.csdn.net/cechun/article/details/6307638

加载中
0
szmneo
szmneo
两分钟都看不完这文章……囧
微笑的书生
微笑的书生
建议楼主修改为5分钟
0
岛

至今只有一个问题  关于ndk

如何断点调试?

0
回回回
回回回
呵呵,正想找JNI的例子,就看到你的文章 ,呵呵。收了
0
回回回
回回回

我在MAC下为什么报这样的错误呢

曾经花田错
曾经花田错
我在linux下也报这个。
0
周上

     我按帖子的方法,一直都是报这个错,怎么解决啊?

我按帖子的方法,一直都是报这个错, 这是为什么, 怎么解决啊?

0
sisyphus
sisyphus
2分钟 有点夸张哦……
0
w
willPeng
JNI主要用来干什么啊?  菜鸟不懂
红薯
红薯
调用底层的一些 C 库 :)
0
jasoneric
jasoneric
楼主有没有什么好点的C代码,而不是想hello,world之类的,谢谢
返回顶部
顶部