android 之 JNI

#移动开发 #Android

1. 为什么使用 JNI
JNI(Java Native Interface)Java 程序中调用 C/C++ 开发的共享库,主要用于提高程序效率,或者

Android 应用对 C/C++ 库的调用(多用于调用移植的库,如语音合成库 pico,图像识别库 opencv 等)

2. android 源码中自带的实例
development/samples/SimpleJNI/*

3. 实例

  1. 编译环境
    Ubuntu 10.04, android 源码环境

  2. 重要代码说明

  1. 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
_ package com.android.myjni;  _
_ _
_ import android.app.Activity; _
_ import android.widget.TextView; _
_ import android.os.Bundle; _
_ _
_ public class MyJniActivity extends Activity _
_ { _
_ @Override _
_ public void onCreate(Bundle savedInstanceState) _
_ { _
_ super.onCreate(savedInstanceState); _
_ _
_ TextView tv = new TextView(this); _
_ tv.setText( stringFromJNI() ); // _ _ 调用内部函数,和调用普通函数一样 _ __
_ setContentView(tv); _
_ } _
_ _

_ public native String stringFromJNI(); // _ _ 用 _ _ native _ _ 关键字,声名 _ _
JNI _ _ 函数,说明它是用 _ _ C++/C _ _ 语言实现的 _ __
_ _
_ static { _
_ System.loadLibrary("test"); // _ _ 装载名为 _ _ libtest.so _ _ 的库,库要放在指定的文件夹下
_ _ (/system/lib _ _ 或 _ _ /data/data/xxx/lib/) _
_ } _
_ } _
  1. C/C++ 代码
1
2
3
4
5
6
7
8
9
10
11
_ #include  _
_ #include _
_ _
_ jstring _

_ Java_com_android_myjni_MyJniActivity_stringFromJNI( JNIEnv* env, jobject
thiz ) // C _ _ 函数实现,函数名字不同 _ _ (Java_ _ _ 项目名 _ _ _ _ _ 类名 _ _ _ _ _
函数名 _ _ ) _ _ ,参数要做一些转换 _ __
_ { _
_ return (*env)- >NewStringUTF(env, "Hello from JNI !"); // _ _ 返回字串 _ __
_ } _
  1. Android.mk,在编译脚本中指名即编译 java 程序,也编译 C/C++ 程序
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
_ LOCAL_PATH:= $(call my-dir)  _
_ include $(CLEAR_VARS) _
_ _
_ LOCAL_SRC_FILES := $(call all-java-files-under, src) _
_ _
_ LOCAL_PACKAGE_NAME := myjni _
_ include $(BUILD_PACKAGE) // _ _ 编译 JAVA 包 _
_ _
_ include $(CLEAR_VARS) _
_ LOCAL_C_INCLUDES := / _
_ $(JNI_H_INCLUDE) / _
_ LOCAL_PRELINK_MODULE:=false _
_ LOCAL_MODULE := libtest _
_ LOCAL_SRC_FILES := jni/test-jni.c _
_ _
_ include $(BUILD_SHARED_LIBRARY) // _ _ 编译 C 库 _
  1. 编译
1
2
$ cd myjni  
$ mm
  1. 安装
1
2
3
$ adb install out/target/product/xxx/system/app/myjni.apk  
$ adb push out/target/product/xxx/system/lib/libtest.so
/data/data/com.android.myjni/lib/
  1. 完整例程下载
    [http://download.csdn.net/source/2610530

](http://download.csdn.net/source/2610530)

4. 说明
此例中将 so 库手动 push 到 android 系统中,如果想将 so 库打在 apk 包里安装,建议采用 NDK

,另有一种不太正式的方式不用 NDK 也能实现此功能(不推荐),见
[http://blog.csdn.net/chenji001/archive/2009/09/27/4601622.aspx

](http://blog.csdn.net/chenji001/archive/2009/09/27/4601622.aspx)

(转载请注明出处: http://xy0811.spaces.live.com/)