|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
6 u/ b5 T7 C4 z. B0 c7 f9 K" \+ IJNI是Java Native InteRFace的简称,也就是Java本地接口,它提供了若干的API实现Java和其它语言的通信(主要是C&C++)。5 V9 B$ p2 {* p( X/ b
+ ^% b: V7 }8 B# t: o4 H0 T
: u: F. z4 ?. O8 q0 C/ \
' b- i; U/ K* ~3 Z0 X1 b
1、打开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显示正确;
+ w: n4 W( l$ o. d( [9 E+ I! Q4 j/ n# E ^% _
2、选中src-->com.testjni.android,打开TestJNIProjectActivity.java文件内代码改为:
( [7 H, r6 h7 {, ?5 |1 {9 X/ {# u( k, x- e2 B
, N2 Q, }6 X, R F7 S/ s
6 p+ P4 p6 O; I5 _. jpackage com.testjni.android;4 g( y& O b4 w( ~ j
: K( ]( ~4 v7 B' Kimport android.os.Bundle;' s( }# k; D6 F# m: k
import android.app.Activity;
: U& {0 Y8 Q( jimport android.view.Menu;, U% j# y/ X- T; A8 B) s
import android.widget.TextView;/ ]1 d9 F! M; h- G( @. O
$ r' e' U0 W2 Z2 \8 H0 ^8 P+ q0 E4 Kpublic class TestJNIProjectActivity extends Activity {
3 Z. \! ^& w& }
4 d$ N7 G4 f) g, g8 t& u0 F6 U3 _ @Override% b. p: ^3 L7 Q8 Y8 {4 l3 z
protected void onCreate(Bundle savedInstanceState) {
6 t r" n0 U( _* C, l super.onCreate(savedInstanceState);
4 j2 {6 m) A9 ?6 Y' i$ Z- ~$ V TextView tv = new TextView(this); . q& U" \% C/ [2 B6 A; T, Z( V, i
tv.setText(StringFromJni()); ; ?) x i" ~- e5 X; o: p% O2 c. H( V
setContentView(tv); 8 r: ~$ U+ R- ~! @/ ?; U' M0 U G
}" ]+ z+ V; v8 {! i! q
& X7 H6 ?: x1 J public native String StringFromJni();- B4 r6 D5 x% H) a" I- A/ N$ J
4 j* n9 j' z: a& Z) v
static{- |' @. j5 v7 c% l- X) b/ h
System.loadLibrary("hello-jni");, x. _, Y8 o9 y# @- _' b" f, Y
}% O" `3 x+ _$ T8 ^/ H: {7 D
! q4 f% ^" N: e}
1 Y* l( E, I: t6 m& M2 k
* B; ~8 t: h& U$ j- |
1 |9 P: e" K" M9 X" n3、编译该工程,会在bin\classes\com\testjni\android文件夹下生成TestJNIProjectActivity.class文件;# {5 W! R$ m+ \ f+ E9 A( ]
: ^- s4 g% Y7 L: T& `7 X" \7 q4 q
4、打开命令行窗口,将其定位到\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也可以是其它版本);
' T7 B* m; Y( R" w) l" W& C- p, w) ], a# d7 L5 g2 I
5、选中TestJNI工程,点击右键-->New-->Folder新建一个jni文件夹,选中jni, -->New-->File,新建2个文件,名称分别为hello-jni.c,Android.mk;+ Z6 C2 a6 }5 a; t
) h- E8 J% C, I6、编写hello-jni.c文件,代码为:$ d5 s+ W& u% D7 U5 v6 H$ w) ]! p0 [
& c$ u3 i* T% u1 M& t 2 P( v" I' E9 d+ Y6 b: t' r5 i2 u
3 U4 o6 I, s6 y# E7 H#include <string.h>
" b3 G2 Q6 A" Q: J/ ]#include <jni.h>- \9 K0 n4 ~7 y4 ^5 }" A3 p
1 J5 Z+ Q. H/ y z* h
JNIEXPORT jstring JNICALL Java_com_testjni_android_TestJNIProjectActivity_StringFromJni
: _' i/ n1 a( t' q5 ]& o! K" |) Q/ B (JNIEnv * env, jobject thiz)7 O+ |% D/ m+ p+ T, \3 d
{
4 C) P) p( j3 D6 ~ return (*env)->NewStringUTF(env, "Hello from JNI !");
0 x; I4 Z- W' V4 k: T% H3 m}
& P+ c% R) ?+ u0 {! h# h- g" ` A# T
' l% e8 R# H2 ?9 ]( _2 C6 S4 \6 F0 r/ l" A9 u: w2 E
3 g" V$ ^6 C6 c$ P
: }5 | I$ c$ V6 r
) a1 z9 o- U0 W4 _" B2 X0 Y8 y0 k
, p, q5 Q7 R- L# X! i6 z7、 创建Android.mk文件,其内容为:7 g. @+ v; H+ ]! o
" a/ S2 H4 C/ G/ W5 Y) R
5 m! j1 l3 r% Z
; Z* C) k) H) a$ [! e7 `
LOCAL_PATH := $(call my-dir)
; K, H' r! [+ A' t/ z8 `4 c. Einclude $(CLEAR_VARS)
+ t7 G' q S# n7 w9 pLOCAL_MODULE := hello-jni
2 P1 n _6 p9 ?8 ^, I2 u/ d& k : H, i$ y% d/ `0 e" K; x9 m
LOCAL_SRC_FILES := hello-jni.c a% u" K% Q; e" B* H T& h
: `5 \9 z, o3 R
include $(BUILD_SHARED_LIBRARY)- b! o) ~3 |0 m- E
% p) P# ^; N( N. ]" I
# I" B4 y9 p3 R! [3 T
0 A# c# E; k: l6 B
3 M! t& u, \9 k R
8 q, j) U3 [: X9 W4 T1 y0 h
2 C# x* i, I9 X% K8、利用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库;
& u! a" B; |$ x% E# ]
/ z: O. P, U9 `9 o9、运行该工程,一切显示正确。. G+ Z% C; }. h- i: w
* ?; w) l% |0 a1 Y- x
以上是.c文件的操作步骤,若将.c文件该为.cpp文件,则需改动两个文件:3 ^& b' m& o9 G! E+ W' ~
+ F- ~+ e9 [" {) }( j1、Android.mk:3 h0 ~' u' a6 I1 R: G
3 y0 d2 [- z4 _2 L& C1 w : S# |9 J* H3 }( w; m- @
4 \- J3 `* h# L. [9 L0 q2 t
LOCAL_PATH := $(call my-dir)
* j7 l7 \/ Z! n, W% Z% minclude $(CLEAR_VARS)
0 _3 Q: S3 ^6 _4 d3 GLOCAL_MODULE := hello-jni. d q8 K& z3 e9 z: _
2 W& s3 @3 h# s e! y3 nLOCAL_SRC_FILES := hello-jni.cpp
" a. x c$ u- u3 D! p. M
) t# a* o" h- F2 m, e$ M% Q" {include $(BUILD_SHARED_LIBRARY)
1 ~, |3 O- G+ h; z; g
$ |# y# V2 O2 a2、hello-jni.cpp:+ p* w/ X8 W6 q Q1 m
% w* b+ Y5 F6 e! c. U
3 t% {4 T$ ^1 \! S
9 v1 N" x3 _# B" o0 k$ }. E6 V
5 }$ V8 l( Z! w4 j6 l5 {; C! j6 K7 C% X# h4 n8 r
#include <string.h>
; b s) {5 o$ p+ C" i#include <jni.h>
! X; u+ {9 M9 e3 h4 n r/ ~ ; `1 y4 c T9 I$ x
#ifdef __cplusplus
4 P( n& H% k! R( ?5 i E5 U2 uextern "C" {
8 [, {4 |1 ], M8 p B4 c; S#endif( l, k$ y2 N; \! e
4 q D5 X; |) B+ r" p3 i
JNIEXPORT jstring JNICALL Java_com_example_testjni_TestJNIProjectActivity_StringFromJni
8 J: n8 t* n$ C* e8 G0 j) ] (JNIEnv * env, jobject thiz)# L2 E w' x/ F/ T) v/ ~& Q
{
) J8 t* X3 }+ F( n4 l- o# X return env->NewStringUTF("Hello from JNI !");$ n# C7 J# z/ I5 e/ M8 k
}
0 N: _7 ?- y& l
0 H0 H; l2 d0 i9 z/ u#ifdef __cplusplus
3 D; r; U0 ]1 K; p}
3 {$ j4 |0 U1 ?* ]7 r; x#endif* N4 `" v, C' A" l
|
|