查看: 1456|回复: 0
打印 上一主题 下一主题

两分钟搞定android JNI

[复制链接]
跳转到指定楼层
沙发
发表于 2015-4-12 15:32:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

实例的开发环境: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 如下:

[size=1em][backcolor=rgb(108, 226, 108) !important]
[color=white !important][size=1em]?

[size=1em]1

[size=1em]2

[size=1em]3

[size=1em]4

[size=1em]5

[size=1em]6

[size=1em]7

[size=1em]8

[size=1em]9

[size=1em]10

[size=1em]11

[size=1em]12

[size=1em]13

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




(3)编辑 strings.xml 如下:

[size=1em][backcolor=rgb(108, 226, 108) !important]
[color=white !important][size=1em]?

[size=1em]1

[size=1em]2

[size=1em]3

[size=1em]4

[size=1em]5

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




(4)编辑java文件

[size=1em][backcolor=rgb(108, 226, 108) !important]
[color=white !important][size=1em]?

[size=1em]1

[size=1em]2

[size=1em]3

[size=1em]4

[size=1em]5

[size=1em]6

[size=1em]7

[size=1em]8

[size=1em]9

[size=1em]10

[size=1em]11

[size=1em]12

[size=1em]13

[size=1em]14

[size=1em]15

[size=1em]16

[size=1em]17

[size=1em]18

[size=1em]19

[size=1em]20

[size=1em]21

[size=1em]22

[size=1em]23

[size=1em]24

[size=1em]25

[size=1em]26

[size=1em]27

[size=1em]28

[size=1em]29

[size=1em]30

[size=1em]31

[size=1em]32

[size=1em]33

[size=1em]34

[size=1em]35

[size=1em]36

[size=1em]37

[size=1em]38

[size=1em]39

[size=1em]40

[size=1em]41

[size=1em]42

[size=1em]43

[size=1em]44

[size=1em]45

[size=1em][size=1em]package com.ura.test;

[size=1em]  

[size=1em]importandroid.app.Activity;

[size=1em]import android.os.Bundle;

[size=1em]importandroid.widget.TextView;

[size=1em]public
[size=1em]class JNItest extends Activity {


[size=1em]/** Called whenthe activity is first created. */


[size=1em]static {

[size=1em]System.loadLibrary("JNITest");

[size=1em]}


[size=1em]public native static StringGetTest();


[size=1em]@Override

[size=1em]public
[size=1em]void onCreate(BundlesavedInstanceState) {

[size=1em]     super.onCreate(savedInstanceState);

[size=1em]     setContentView(R.layout.main);

[size=1em]     String str =GetTest();

[size=1em]     TextViewJNITest = (TextView)findViewById(R.id.JNITest);

[size=1em]     JNITest.setText(str);

[size=1em]      }

[size=1em]}




如下:

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

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


里面有个

头文件,内容如下:

[size=1em][backcolor=rgb(108, 226, 108) !important]
[color=white !important][size=1em]?

[size=1em]1

[size=1em]2

[size=1em]3

[size=1em]4

[size=1em]5

[size=1em]6

[size=1em]7

[size=1em]8

[size=1em]9

[size=1em]10

[size=1em]11

[size=1em]12

[size=1em]13

[size=1em]14

[size=1em]15

[size=1em]16

[size=1em]17

[size=1em]18

[size=1em]19

[size=1em]20

[size=1em]21

[size=1em]22

[size=1em]23

[size=1em]24

[size=1em]25

[size=1em]26

[size=1em]27

[size=1em]28

[size=1em]29

[size=1em]30

[size=1em]31

[size=1em]32

[size=1em]33

[size=1em][size=1em]/* DO NOT EDIT THIS FILE - it is machine generated */
[size=1em]#include <jni.h>
[size=1em]/* Header for class com_ura_test_JNItest */

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

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

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




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

[size=1em][backcolor=rgb(108, 226, 108) !important]
[color=white !important][size=1em]?

[size=1em]1

[size=1em]2

[size=1em]3

[size=1em]4

[size=1em]5

[size=1em]6

[size=1em]7

[size=1em]8

[size=1em]9

[size=1em]10

[size=1em][size=1em]LOCAL_PATH:= $(call my-dir)
[size=1em]include $(CLEAR_VARS)
[size=1em]LOCAL_SRC_FILES:= /
[size=1em]    com_ura_test_JNItest.c
[size=1em]LOCAL_C_INCLUDES := /
[size=1em]    $(JNI_H_INCLUDE)
[size=1em]LOCAL_SHARED_LIBRARIES := libutils
[size=1em]LOCAL_PRELINK_MODULE := false
[size=1em]LOCAL_MODULE := libJNITest
[size=1em]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文件放入到windowsXP下android的SDK主目录下的tools文件夹下

(9)在模拟器中执行程序

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



输入adbdevices如下图后:

然后输入adb remount如下图:

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

如果成功了就可以看到


(10)然后运行程序

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

运行效果如图:




回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入因仑

本版积分规则

快速回复 返回顶部 返回列表