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

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

[复制链接]

该用户从未签到

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

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

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-11-24 20:00 , Processed in 0.156250 second(s), 23 queries , Gzip On.

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

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

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