android之JNI
|Word count:607|Reading time:2min|Post View:
android 之 JNI
#移动开发 #Android
1. 为什么使用 JNI
JNI(Java Native Interface)Java 程序中调用 C/C++
开发的共享库,主要用于提高程序效率,或者
Android 应用对 C/C++ 库的调用(多用于调用移植的库,如语音合成库
pico,图像识别库 opencv 等)
2. android 源码中自带的实例
development/samples/SimpleJNI/*
3. 实例
编译环境
Ubuntu 10.04, android 源码环境
重要代码说明
- 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/) _ _ } _ _ } _
|
- 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 !"); // _ _ 返回字串 _ __ _ } _
|
- 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 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/
|
- 完整例程下载
[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/)