|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
# d2 K, O! C7 h& P2 U+ k
JNI是Java Native InteRFace的简称,也就是Java本地接口,它提供了若干的API实现Java和其它语言的通信(主要是C&C++)。
8 v, |0 g0 D- `7 ~* O9 g8 I4 f3 F8 o; p+ p$ {
E3 d# V2 W8 H- S
! d; o7 c) C1 o; Q1、打开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显示正确;
2 c' T4 i- f2 Q8 x C- e! h/ p2 i+ p2 H! Y2 `- {
2、选中src-->com.testjni.android,打开TestJNIProjectActivity.java文件内代码改为:/ P M8 k' z7 w5 r: j, A
( n. q/ n- I! |
. d2 D8 a+ A3 ]6 F* Q5 @/ u2 W& X- w. Y. h9 M0 \ A( D3 X
package com.testjni.android;2 A0 h7 G# j# Q) G+ L, q7 J
+ n1 L) r" E9 i+ Q) ?import android.os.Bundle;
' M! Y& G7 y* Zimport android.app.Activity;: n+ v0 R6 p3 g9 [7 ~$ @( E; S3 v
import android.view.Menu;# p) k9 ~ G4 _1 ?" m0 \+ q
import android.widget.TextView;5 [" e8 F# w, z* ~, l9 N
" x7 s0 h. K+ i; T/ d5 I
public class TestJNIProjectActivity extends Activity {7 F' Q- W$ g. P% N% ^6 b. X
( N3 h9 t; j4 Q
@Override( S1 G, e8 c( S; P
protected void onCreate(Bundle savedInstanceState) {6 W) N% C" [7 \
super.onCreate(savedInstanceState);
6 S1 B7 R: [3 [+ a" j: Y TextView tv = new TextView(this);
( g" b2 q2 `' ]/ c tv.setText(StringFromJni()); 3 t5 U# F1 B ~, [
setContentView(tv);
( I& u0 W8 q: v! e% N }
3 Z( A& t7 d/ u( }5 ~ & I9 {8 ^) P& o. K
public native String StringFromJni();
7 Z: c/ G- M6 ^* S$ I! t9 [
. B3 K* ?1 R5 \! e" {7 @# X" Q, d static{
& ?( _ V' ]6 {0 e9 b; _5 q System.loadLibrary("hello-jni");" ]% U) H% a3 ~2 x$ V
}
% \) p8 W/ K+ m# M! W
( C; M* j- ]5 ~1 I}/ ]* I3 T+ G5 k- V7 C* z
1 F) K }% _ E
9 ?- v6 x1 }, e9 e* l$ r% c3、编译该工程,会在bin\classes\com\testjni\android文件夹下生成TestJNIProjectActivity.class文件;( I9 G I/ x" y1 B/ S+ ` Z; i* K
0 }( D% x l; @7 \4 [$ X! v4、打开命令行窗口,将其定位到\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也可以是其它版本);
# M) p5 m+ k5 ?/ Q3 N: g( l. p: D9 d6 c
5、选中TestJNI工程,点击右键-->New-->Folder新建一个jni文件夹,选中jni, -->New-->File,新建2个文件,名称分别为hello-jni.c,Android.mk;8 w! ~! D, _) w+ M# M
' i( I2 C0 g5 f# \" V" H q: }6、编写hello-jni.c文件,代码为:& p7 c9 @/ M7 {8 ]9 V0 X
& ]$ P6 J( n) B3 b
4 a: ^5 v- P% w( x( N8 h. V2 W1 Y4 X) ?. x5 j* Z
#include <string.h>
# f ?4 W" M- N#include <jni.h>4 F8 R0 g# a% q( {7 {
|; q8 S/ e, `* i3 z6 n" b1 z" \
JNIEXPORT jstring JNICALL Java_com_testjni_android_TestJNIProjectActivity_StringFromJni
0 _- j( T1 D' I8 @9 G6 w2 [ (JNIEnv * env, jobject thiz)8 h" Q3 E8 k3 I- ?# c0 H; K
{
+ r! E/ V1 N+ r5 }6 v return (*env)->NewStringUTF(env, "Hello from JNI !");
- G( j9 F' Z8 d+ w3 X o}1 n1 w4 R ]. G5 X4 u, t/ B, _
! _+ Q/ \ D: c9 ^0 E
/ D$ ]* y T3 u: x4 w
, e6 s1 W* u$ x8 ?
2 u2 P' ~9 [$ m6 ^0 j% v
: @: c# P% W6 u0 N8 |1 i
- c+ a/ ~9 l" _7 y7、 创建Android.mk文件,其内容为:
7 i( f2 {5 {( T( F5 ~0 h- ] y X" v3 c6 R6 {/ \
2 h1 P* s5 h& \ b8 M- Q. P! C1 X) h) F. T @/ o
LOCAL_PATH := $(call my-dir)
+ @6 }- J a- ]include $(CLEAR_VARS)+ P J5 f9 F& P6 @2 Z' \% K
LOCAL_MODULE := hello-jni
e8 q. s0 `" N ! Q9 _$ g7 k9 J* Q$ }+ D' U
LOCAL_SRC_FILES := hello-jni.c; |4 @; X$ H+ m. o/ e
3 B& Y. e+ N2 d! Q: \
include $(BUILD_SHARED_LIBRARY)
2 d6 C9 M6 L0 Z& e* S 2 S9 U* }; @& k# H: x( _. ?! H7 \
& U' R, W. f5 K/ v2 x
. d) \+ \4 O+ ]2 U3 f! i
9 L, g# T. e" f1 |' c
" ]2 z( [) R( G+ x) p* F5 _- C5 j+ I, w
8、利用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库;
3 ^9 e) C- \- @" U& h) G1 J+ x* I# [2 T, n% H9 v$ m' C4 B1 Z
9、运行该工程,一切显示正确。7 H/ T5 b$ N7 y& s8 e# U
) [8 M. b+ x, w! u
以上是.c文件的操作步骤,若将.c文件该为.cpp文件,则需改动两个文件:
* l( R5 P5 c! M2 B7 p" j+ C/ k2 [8 j( i; F9 r) `6 s4 d9 @4 D! v) A- A
1、Android.mk:
7 ~0 [8 }0 m# M3 a" ?- K
' g% M' |* h) ~9 ]8 p4 N
3 S, }6 Z" Y4 p1 B' ]
( h5 L! z/ s" d8 Z- `, ~+ v9 ZLOCAL_PATH := $(call my-dir)
) s. p6 Y A# P+ E3 i E* Uinclude $(CLEAR_VARS)
2 i. `8 ?/ I' V1 kLOCAL_MODULE := hello-jni
" Q7 @9 u, m3 G) F
& Z4 `+ |' M/ G# R& W' G" RLOCAL_SRC_FILES := hello-jni.cpp
# A) R9 m" L9 |/ }5 M$ v
& x& n* N( u8 R% Ninclude $(BUILD_SHARED_LIBRARY)
5 q! B5 j* ]; d9 M, n, t5 {
5 h& R) x& m$ }2、hello-jni.cpp:
- a% D& f. G! q. b4 {8 ?; ^9 D: T
6 I2 D! L2 ~3 g0 t% D5 e# i+ O8 H! ^# f
1 j% S! {5 Z" [
; z; C: ~7 B) @) y1 M8 E#include <string.h>* Q8 O; P" P" |6 h( X5 l& K! N9 k! X
#include <jni.h>: |- N7 c r" l( ^
. ]" T9 o) a- ~8 A( A. \
#ifdef __cplusplus4 s" N7 y+ a9 ^" b) F. P- O. n
extern "C" {
0 p; u2 P0 R% J2 n2 h8 ~# t#endif" f9 [5 g! g& F
% l; B% U) [* b$ w& ~$ ] K
JNIEXPORT jstring JNICALL Java_com_example_testjni_TestJNIProjectActivity_StringFromJni! Z6 ?+ M `6 {" L
(JNIEnv * env, jobject thiz)8 M' Q- m: H- M3 ?, |% ?
{0 J2 H3 {1 p8 \; q: @. U
return env->NewStringUTF("Hello from JNI !");
3 x1 V( t+ Z |. |}: {; k& ?8 t' @* D9 v. ~0 e% r H
1 s/ M' V2 {7 i e#ifdef __cplusplus
5 m8 [6 j" v4 `}6 |, q# o% t5 w' X+ Y) y" {
#endif
/ j2 _! q0 H( @( a8 |5 Q" z |
|