|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
( i1 J6 ]$ V% i+ _5 P+ V8 s a t& i8 LJNI是Java Native InteRFace的简称,也就是Java本地接口,它提供了若干的API实现Java和其它语言的通信(主要是C&C++)。3 \! S; o$ G# G9 d1 z' q3 |
% l! q d0 s! \: f3 z0 e
. Q+ U( H7 N7 g, q( O
; }# D+ d2 Z$ t O1、打开Eclipse,File-->New--> Project…-->AndroidApplication Project-->Application Name:TestJNI,PackageName:com.testjni.android, Minimum Required SDK:API 10, Android 2.3.3(Gingerbread),Next-->不勾选 Createcustom launcher icon, 勾选Create activity,Next-->选中 BlankActivity,Next-->Activity Name:TestJNIProjectActivity, -->Finish,运行AndroidApplication显示正确;. \: \+ s6 i( [9 C. A
1 H1 L. `+ x7 B0 i5 {( I) b
2、选中src-->com.testjni.android,打开TestJNIProjectActivity.java文件内代码改为:
7 W( b1 m P+ `# ~! z3 Q x, Y4 {- ?
( k1 H# y: T/ S: D/ ^6 p# H7 ^* o# F. q( R7 R9 r& R
package com.testjni.android;' d7 E- D3 q X$ k4 m! u
) s" N1 L. f) ?7 c
import android.os.Bundle;
4 |( L) J0 ?# s- ]! G, }9 uimport android.app.Activity;+ i. {1 g/ W0 {- \0 K- I" q2 b
import android.view.Menu;$ s, E5 l5 H4 u# Y( v" g
import android.widget.TextView;: U3 }3 X) N9 o9 A& u3 W& M1 m
4 G# w- ^# T+ q" g% Q
public class TestJNIProjectActivity extends Activity {
3 m! g% t' T; K . j6 g) j% y6 [ W( e
@Override
# N* D1 [, R. t) @. Z2 z protected void onCreate(Bundle savedInstanceState) {- n# o7 ?3 ~9 W1 a- s: P! ~
super.onCreate(savedInstanceState);/ O" @; x4 Q5 H6 K
TextView tv = new TextView(this);
1 a) Q. I. ~ r$ P4 q# [9 B tv.setText(StringFromJni()); 0 P% W# ^+ U+ d5 c# J4 V2 a
setContentView(tv); % t8 ]/ r( C$ l, p
}0 _0 F, [/ a2 S T
: ?* B* q9 ^* `1 s; S" u public native String StringFromJni();. g/ h1 i5 J# @- e; M9 i
- Q& U6 A4 { J5 N' \7 w4 e static{
' b; T: U: H, v6 L {. | System.loadLibrary("hello-jni");
9 F# N! I E O. @$ X: b" j9 R' h }0 |" b- Y% B7 i
" i1 R! c- {7 n. \ T6 n/ R: |3 t4 z
}: \$ w1 D P' i5 B0 }+ f- P
& }8 a. |3 d0 z1 I7 V1 o8 n& ~- i8 q& ?% T' G0 ]4 ] k0 [
3、编译该工程,会在bin\classes\com\testjni\android文件夹下生成TestJNIProjectActivity.class文件;
8 Y& Y$ }+ d/ n) v, n
. J& y# d. F: i5 [0 T k6 g4、打开命令行窗口,将其定位到\bin\classes目录下,输入命令:javah –classpath D:\ProgramFiles\Android\android-sdk\platforms\android-10\android.jar;com.testjni.android.TestJNIProjectActivity,会在classes文件夹下生成com_testjni_android_TestJNIProjectActivity.h(说明:*.jar也可以是其它版本);7 \; N8 R. |, e- c
- [4 }# v0 U# ^( s% q" G1 U/ s- ]5、选中TestJNI工程,点击右键-->New-->Folder新建一个jni文件夹,选中jni, -->New-->File,新建2个文件,名称分别为hello-jni.c,Android.mk;- B0 ~; p4 N, ]" X8 E5 ?; U
1 o( S) J3 x# ]* c" [: M# A0 j4 l) M
6、编写hello-jni.c文件,代码为:
' P4 @7 m! W o! X; z5 u5 u
1 d3 I5 W; f/ F( W% N. J % Q& i; f: ]0 f( Z
* W% F+ v/ d- u2 _5 X$ n#include <string.h>
) _8 {' q2 W" M4 \$ a#include <jni.h>1 y- B+ v) R+ q' B" r" N) Y* R
& x% o# D5 d. a8 w0 W+ h
JNIEXPORT jstring JNICALL Java_com_testjni_android_TestJNIProjectActivity_StringFromJni1 \/ u! E$ C5 H8 a; K; ^
(JNIEnv * env, jobject thiz): ~4 u9 U8 [1 f& t; Y; n+ y$ ]1 U
{, T5 m4 s. H$ ]% V
return (*env)->NewStringUTF(env, "Hello from JNI !");
0 N3 Y8 B; u9 Y4 p) x- H6 h0 M}1 L3 z+ z2 o- [% \' I' U
( _* |. Q* [- ?" @: |) P2 _8 s0 |7 L: w Q( q# L
4 z' R, l( o: f) ~! _1 G+ X1 @ _9 I8 W& v
1 \% E# s1 L& a) D& }' @8 C. N$ z1 y! b, R- [1 s
7、 创建Android.mk文件,其内容为:" p* n) Z3 ~3 F
6 U' z: W9 N9 ^ {: g$ l: X O
' D% b7 X6 ?* j, C2 F' z- p& l3 @% V6 P1 N2 {' g- k. r: \0 q
LOCAL_PATH := $(call my-dir)
' k2 R S! ?- Xinclude $(CLEAR_VARS)
) ^% I* b) ` s" I8 b: HLOCAL_MODULE := hello-jni
, Z& l5 t- v8 ?
: v4 O! j' A; s' e$ y2 X- M3 ^' dLOCAL_SRC_FILES := hello-jni.c, W, a4 |/ }, g s5 ~
) k0 u* b- D# X$ Q8 Hinclude $(BUILD_SHARED_LIBRARY)
* a" |% S5 H$ f V" i$ } ! ?2 x8 s3 J9 h& L9 G
6 S/ p3 K- y6 D5 M9 h. g
. Z: x# n/ ]+ M* X& _( l* I+ J4 R4 G, n) e1 Q
9 {2 w. K" O5 L- ?! M# J$ M
f$ D* J3 s6 _5 i9 ~8 f) s" m) \ H8、利用NDK生成.so文件:选中工程,点击右键--> Properties-->Builders-->New,新建立一个Builder,在弹出的对话框上点中Program,点击OK;在弹出对话框EditConfiguration中,配置选项卡Main:Location中填入NDK安装目录,D:\ProgramFiles\Android\android-sdk\android-ndk-r9\ndk-build.cmd;WorkingDirectory中填入工程的根目录,E:\Test\Android\HelloJni,点击Apply;配置选项卡Refresh,勾选Refreshresources upon completion, The entire workspace, Recursively includesub-folders,点击Apply;配置Build Options选项卡,勾选Allocate Console(necessary for input), After a “Clean”, Duringmanual builds, During auto builds, Specify working set of relevant resources,点击SpecifyResources..,勾选TestJNI工程的jni目录,点击Finish,点击Apply,点击OK,会在\libs\ARMeabi目录下生成相应的libhello-jni.so库;
+ @0 U( J7 k% y: y9 ?! A
" u0 J1 s1 Q. w; X: l/ m/ ^9、运行该工程,一切显示正确。- @) i. E9 s& T5 Y, {9 L
$ B+ F, ^, r" c9 z/ f
以上是.c文件的操作步骤,若将.c文件该为.cpp文件,则需改动两个文件:
- R( r! e3 Q+ }0 \3 S$ P; }; ~, m( Y# @1 t# h0 F; s' K
1、Android.mk:0 L( B' f3 O; ]& L7 z# q
& g0 B- R1 s% j% j0 | 0 r! g/ a. ?. Z( W: Q7 s
+ U, @& @: y3 V- x. h8 q
LOCAL_PATH := $(call my-dir)
5 l6 Y$ a$ Z& }0 jinclude $(CLEAR_VARS)3 W6 x' @1 S% ?" i% b# F" @# B
LOCAL_MODULE := hello-jni/ H" M+ m) G6 y/ ~ D1 _- R, d
( `7 X) y4 G- f$ i; CLOCAL_SRC_FILES := hello-jni.cpp7 X' I2 H E4 y
) d/ Q7 C [: T9 u4 r: _include $(BUILD_SHARED_LIBRARY)5 D6 d8 R. h9 g" r
; a* f5 ~9 I: J, }/ S3 L2、hello-jni.cpp:
+ b- [4 V3 X# u( }' v7 |
1 I5 x) [; h! R; G, ?
* {; y' e# D1 k8 D9 L$ | W0 k* f+ G+ c, ]4 s) U' _
4 q/ l4 G2 C( i3 R" G+ S. ]7 ?. }6 }2 Y
#include <string.h>
5 E/ v' |6 }- w% W5 B* J#include <jni.h>
: e7 m* n9 g9 i6 {7 W4 B
1 a% Z3 k% j. s; o; a" L#ifdef __cplusplus
% l8 t& {; U: Y6 h) O5 Z; dextern "C" {
- ^. E2 s$ H: f& ^9 w* V#endif
0 i5 g% t. i, [. j5 U- _0 U 8 S: v( J, {/ O' r, {
JNIEXPORT jstring JNICALL Java_com_example_testjni_TestJNIProjectActivity_StringFromJni
+ F% G k! x% M8 } (JNIEnv * env, jobject thiz)
. T8 q$ a& `* l{
/ e. q, F: y; N8 n: r" Z$ R1 P; F return env->NewStringUTF("Hello from JNI !");
2 a( e: f( Y5 a- n+ n}
& k: @: e2 X% U! z6 t7 u0 ]( ]
1 U( R7 Z$ O/ c#ifdef __cplusplus
1 e. E1 b1 D9 X: s2 a) s, d}
4 D q4 a7 ?6 X- R' p/ C1 F2 B#endif
9 i/ I& `+ f2 I5 a8 ^4 r1 X |
|