找回密码
 注册
关于网站域名变更的通知
查看: 306|回复: 1
打印 上一主题 下一主题

利用JNI技术在Android中调用C++代码

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2021-1-25 18:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
) x# B7 `' g7 i! n) |+ c4 M4 R
JNI是Java Native InteRFace的简称,也就是Java本地接口,它提供了若干的API实现Java和其它语言的通信(主要是C&C++)。3 U. S  U; W" m7 ]3 O
) M$ M) h. B: h* ^! Z/ X2 d
5 G8 p  L8 A3 B0 m  H
- B  y4 f* y  C8 x
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显示正确;. ?+ @% r) `9 V1 l- u4 `% R2 C

# o  `; J9 h' r  ]' M2、选中src-->com.testjni.android,打开TestJNIProjectActivity.java文件内代码改为:4 O/ M& l/ N4 X; p7 _
5 K; ?  G) M+ O5 g4 y( P1 W
, y4 l/ L. q0 Q4 n- b0 O7 B7 O
; N$ R: i. v0 g, Y1 P
package com.testjni.android;
) ]. x. d7 v: w. U+ I) x5 Z 8 @- E1 K. k# n: O9 r7 X
import android.os.Bundle;
) k  `- e7 U/ u5 n( n# kimport android.app.Activity;
; Z) [  ?! y1 j2 E) eimport android.view.Menu;
+ d. R$ D, F  ]! U2 Qimport android.widget.TextView;
! p; E3 O( `; [8 }/ z% [0 m ; a. X% s) [+ s+ w
public class TestJNIProjectActivity extends Activity {* U7 O3 {* X4 v& o1 @( n. \

; w5 I: J* d4 ?: ]3 \) u0 ~        @Override, S8 Q/ ]0 y9 H# r  B- K
        protected void onCreate(Bundle savedInstanceState) {1 k; ~- h% s6 ~  {8 R2 P
                super.onCreate(savedInstanceState);
1 P* {2 }/ C! Q0 E4 M: x% r                    TextView tv = new TextView(this);  
1 n- ~4 {8 J1 L" Q+ [" k                    tv.setText(StringFromJni());  
3 Q. N2 x2 Y0 P% k; m' P                    setContentView(tv);  
0 K# g% @7 @- G& i# Z' ?$ v: D7 j        }1 o6 V8 {! y/ [, T6 C# M

, G' O+ M7 v1 w/ U% r! Z$ F" s        public native String StringFromJni();/ `7 ^' \: Q& w3 i4 q- P" T

4 @: g4 N: B' j* i4 b        static{$ B  Q6 ]5 Z0 p
                System.loadLibrary("hello-jni");* c5 e% [  v+ g$ i. i( P+ k% ]
        }+ _  m+ T( ~% y5 `# l: J3 [0 h7 a
        / \- l6 Q8 V" Y6 d0 n: J; w
}+ y* C- ^& f# y" k7 i; f
4 }2 p# O$ R8 i; @; C+ O$ V

9 c! O2 e* D% w3、编译该工程,会在bin\classes\com\testjni\android文件夹下生成TestJNIProjectActivity.class文件;8 q6 k6 s3 Z: k/ Q8 Z9 p& \& v0 ^

) \: i* A4 k0 T/ h/ e  Z0 @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也可以是其它版本);7 Q/ i) k' @) t8 a
: P( S. {/ k$ e, c& W( \
5、选中TestJNI工程,点击右键-->New-->Folder新建一个jni文件夹,选中jni, -->New-->File,新建2个文件,名称分别为hello-jni.c,Android.mk;
. y( c8 }* D) I+ M9 s( G0 I  D
/ l7 [/ L! {4 B3 C/ H4 r! a; M6、编写hello-jni.c文件,代码为:
% V8 ]: ?- i  n; Y) ~0 u: k% ], K" d% J' Y

: W8 M6 [+ `) S0 @% A# }0 R4 o" j4 g2 j
#include <string.h>/ B8 \) _/ t* V( m1 S9 u% Z/ Y; i# B
#include <jni.h>
3 G$ Q9 b3 h8 e- @( x6 ?; u
+ O3 c! n% b& K# pJNIEXPORT jstring JNICALL Java_com_testjni_android_TestJNIProjectActivity_StringFromJni
" h9 G, E" r) ~  (JNIEnv * env, jobject thiz)1 ?; K2 d, [! c# S
{
! |3 D# ]+ l2 k1 W; W" x+ l     return (*env)->NewStringUTF(env, "Hello from JNI !");+ g: `9 V# n. v2 `) M
}: R  r1 u2 I! v- w1 k( y* B
5 [% h8 B. g1 G" b; d6 B

9 o8 @( `, [* a( d% p+ R$ x0 g " r; A$ d- B# l' |+ X( f. |
8 b# W1 C+ I. _1 `1 J

: X, A+ A9 m+ g4 O
1 K8 S3 P$ B$ N# m. j3 j* v7、 创建Android.mk文件,其内容为:! d& X$ V! R4 `- r  O) r+ `' R

  \* i) P6 F; C$ g; F
% u2 S* p6 g0 c( k1 W' V
- e3 Y9 j5 w/ x  V: y4 m& z. `2 }LOCAL_PATH := $(call my-dir)
. D; _$ z. N1 r7 b2 I$ X5 A. yinclude $(CLEAR_VARS): ^; Y" V$ ^+ _3 i9 t3 z; G
LOCAL_MODULE    := hello-jni
) V2 {/ t" _) n9 U) D* T; H" J1 k
  d% i2 [; [5 ]  Z, oLOCAL_SRC_FILES := hello-jni.c5 G; |" @- J6 q; Z+ {' t! o  k+ M

( r: M6 e3 h! h" Finclude $(BUILD_SHARED_LIBRARY)
5 d0 [4 K$ F( q/ T5 o
, U# L7 b; a  d
2 h: O- y$ Z/ y6 P( r ' _/ T' l/ l; H7 d; G( J9 Y- L" c9 E; [
  }) A; I: h9 |6 D  e/ J+ d

+ [7 B2 n- a0 b5 v
; O2 Y6 L( [2 d) `7 c% o, x7 I8、利用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库;. |8 M0 x8 }3 z: n. x
0 W) Q: Y0 q: K. W) M: c
9、运行该工程,一切显示正确。: B6 X; o. e$ W" u2 e; a7 a4 N
0 y3 w6 k7 |* f2 v% n
以上是.c文件的操作步骤,若将.c文件该为.cpp文件,则需改动两个文件:
. L5 P1 q3 {% Q6 Q! W: b  W5 C7 r0 j- I& L0 T
1、Android.mk:
  r( |* w+ v" F" i3 J
3 c5 ^& F4 W5 @% ?5 F( X 5 N) `. B0 K' S2 |+ N- u

3 S: J7 Q) f+ r1 @$ @# N) MLOCAL_PATH := $(call my-dir)
! O# u+ p- Y$ c1 W5 finclude $(CLEAR_VARS)8 l8 O2 m- }' H  S
LOCAL_MODULE    := hello-jni
, ^% J) ]" I$ ]+ [5 L % W& A) m6 ?+ N" |7 e- j" ]) g
LOCAL_SRC_FILES := hello-jni.cpp$ z- N! l$ P' D" ^5 D# m

5 z& ~. y: U) n- ginclude $(BUILD_SHARED_LIBRARY)
8 K& K  O6 n1 X  q' T
1 ]/ o2 a" T  D8 O$ B9 [/ T4 a2、hello-jni.cpp:9 ^$ o; k9 B6 t6 M& Z3 G

: n7 R8 w3 f: T" m
9 U1 P* P7 _6 K/ _/ E5 p) M2 l8 O: t; `) K" ?# C
& [0 o, E, l! v9 |9 y) k. ?

$ r  z2 R$ |4 c8 F1 z4 E8 e#include <string.h>- I) i" @4 O: l
#include <jni.h>
) r& i, J$ }4 V2 |2 X! I # E; q0 o, l) {: I0 y/ z" u0 r
#ifdef __cplusplus
- Q8 t" o! x5 _  C, h0 a! Bextern "C" {
6 v3 i( \" G" U7 K#endif  G+ V* b/ ]/ I' g) n

& L2 i7 j& q' r& q( i6 YJNIEXPORT jstring JNICALL Java_com_example_testjni_TestJNIProjectActivity_StringFromJni
* f: i+ L; T' B0 h  (JNIEnv * env, jobject thiz)0 O8 X' f/ n% L5 ?
{
/ t& w" X+ ^0 K1 p8 b  c: @     return env->NewStringUTF("Hello from JNI !");" k" z9 k1 Q. I3 p6 P! g
}
$ h* \' F0 b8 L2 s& ^: d
( s' \7 \4 T8 U' }9 l3 n) m" X# n8 O#ifdef __cplusplus" b7 n: V  R1 J( B. Z6 M( g7 i; H
}
5 ]) X, q9 P8 Q' m9 h- e1 g) u#endif/ j% P7 K% u9 B1 Y8 e" `" u2 b

该用户从未签到

2#
发表于 2021-1-25 18:45 | 只看该作者
JNI技术在Android中调用C++代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-11-24 18:33 , Processed in 0.171875 second(s), 24 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表