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

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

[复制链接]

该用户从未签到

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

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

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-11-24 22:45 , Processed in 0.140625 second(s), 23 queries , Gzip On.

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

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

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