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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
+ ~3 \) g% ]. j
JNI是Java Native InteRFace的简称,也就是Java本地接口,它提供了若干的API实现Java和其它语言的通信(主要是C&C++)。
+ G7 d8 e1 a) P8 g9 q4 {# t9 p! a( C) v. S1 o0 e( c

# T: O5 M9 y4 W/ B( E  Y& {! I+ j; N+ d; k: i# ]; @, i! L
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显示正确;
  F  R$ v0 B/ b- \) N3 e3 W' s8 w! I" j3 h) X  }( c5 _
2、选中src-->com.testjni.android,打开TestJNIProjectActivity.java文件内代码改为:
# N. x3 m4 W$ C+ h9 n! ~1 n
* f- l7 A+ X) l2 q
6 o1 n$ K3 }9 Q% d4 N
( g; C% F2 J# i( m/ zpackage com.testjni.android;2 j  J1 I& K( s* U
7 T% {# h& _5 \! m
import android.os.Bundle;% {$ u$ Z2 P' I" C% P* l
import android.app.Activity;
! K9 I# u( B4 d0 I7 ~9 I7 V& V. timport android.view.Menu;7 Z+ _3 g" @+ [, d6 y0 I' j2 D
import android.widget.TextView;
. W$ B  V4 q9 y" Q5 w3 Z1 B
7 r$ m* o' d0 s' v% Ipublic class TestJNIProjectActivity extends Activity {
% y! c+ Z3 _) ~3 v$ E
4 ~+ I/ D. @/ ?2 U( |        @Override
' s4 g& s' |# j- V7 K& b3 a        protected void onCreate(Bundle savedInstanceState) {* N( g! r% P' J
                super.onCreate(savedInstanceState);
+ ?, e4 k; l5 h) c) u% S9 M                    TextView tv = new TextView(this);  & Q( W- x* S* H. F. o' e' O0 u
                    tv.setText(StringFromJni());  
' v8 E# `; p; X. m& X$ ^                    setContentView(tv);  7 c3 ?  e" Z% C: H" R7 n# l
        }
9 p8 S( D8 F$ B2 E! ^& x
6 B+ `2 u  c  X$ I2 K& D; n        public native String StringFromJni();
! y  f$ t$ h8 S9 ` ; j& Z1 K, h4 p& M* T
        static{; p% Y$ Q3 m: U) Z
                System.loadLibrary("hello-jni");
; u( \; T' E$ y  F" Z        }' p/ T1 g% [0 p& t5 G' u
        4 s" Q- N2 X' s! j( G: A+ Q* N
}
' [1 K7 x, x: v4 s) v9 E & Y9 X) I6 ?% ?, c3 |3 c1 E6 m

6 i/ n; B: G$ t* j2 b$ p3、编译该工程,会在bin\classes\com\testjni\android文件夹下生成TestJNIProjectActivity.class文件;( n( [( U6 }' H  K& G* |, F) C
  _. x1 Q% g% o$ e. `$ V9 ~& X" ^
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也可以是其它版本);( M3 r- h8 v) v; n; s
, b# e& {5 }7 `
5、选中TestJNI工程,点击右键-->New-->Folder新建一个jni文件夹,选中jni, -->New-->File,新建2个文件,名称分别为hello-jni.c,Android.mk;
' J' Q, f7 M$ S
, J4 |+ R( v# V1 R, r9 S2 m6、编写hello-jni.c文件,代码为:5 U7 y5 P3 P' }0 r! U

) b" Z4 |, M2 N4 R) J4 J& L3 o & Z, _6 B0 y0 j& H: f
, {) o- x# r/ u: X; X9 m# e% @
#include <string.h>
+ K; y$ t2 ~$ v+ I9 E' N#include <jni.h># h; U  _* b! Z

$ k5 N8 Q0 ~; K* yJNIEXPORT jstring JNICALL Java_com_testjni_android_TestJNIProjectActivity_StringFromJni
5 Y( y: u; M/ r" \1 S  (JNIEnv * env, jobject thiz)
! ]9 n: J/ x: X4 M3 S' a. O  Z{
8 a3 G4 ?/ b; e. I; ?# r& Y     return (*env)->NewStringUTF(env, "Hello from JNI !");
" l  Z7 _$ `% f2 f$ h: A}
+ I& w$ U% D. P& G# e8 @
8 v- ?8 [3 v7 Q
1 x# R" Z) H8 ~! |9 h+ k. [ & p* T6 k# N7 `! |
+ b  E7 L3 y  ]4 i* e
" _, Y2 q* x# V$ E& P
9 z8 P% u2 V1 W5 p( t
7、 创建Android.mk文件,其内容为:7 w: k4 k4 \. L

" |, Y6 L! t5 P2 p& h . d( W  U# A8 m! g3 \
' q! H* m- n9 t, T
LOCAL_PATH := $(call my-dir)
" w  ?0 s* ]2 z0 Zinclude $(CLEAR_VARS)* w2 R  W) V+ a# D' Q( H
LOCAL_MODULE    := hello-jni5 B9 j0 I5 ]+ Q, l
0 O7 k3 T0 l8 ?- Z0 G2 s$ a' I# S& v
LOCAL_SRC_FILES := hello-jni.c
: _8 B8 H+ Q. K( d2 v1 z, p9 | , B; k: _" T+ \2 m
include $(BUILD_SHARED_LIBRARY)
6 |7 g5 S6 U$ j6 Y6 p
2 e" i9 q7 D: R$ \' G8 s) i5 r- L3 {1 M0 F5 ]
3 F; s% ?4 S# y, g9 y
" w, p+ A1 f8 A. e' W# ?. B# O
2 j- u: T$ v7 l% m% |1 Y
- R7 {8 n7 K( M! \% p
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库;
0 n% o! r5 q1 o' K$ k
2 X$ f# a0 @0 f/ F2 ^4 k4 w9、运行该工程,一切显示正确。
) ~/ d' o' I* {/ L
  U/ F9 y& W: e0 P% z* g5 K: |以上是.c文件的操作步骤,若将.c文件该为.cpp文件,则需改动两个文件:# A, F3 f7 J. R- r/ V/ ^  M; t5 ?+ e  ]
0 h" w% F/ e( U+ k2 a
1、Android.mk:
6 J# @/ O. l9 O4 [9 ~. p6 ]* }, i7 y
. K& w( e( S% x' `
' H, {- l( q. D6 E% ~1 a& K- c+ A$ [% ^5 q- ]- s) J4 K! k; {/ k
LOCAL_PATH := $(call my-dir)
+ W. Y. O' _$ R8 g6 M. Zinclude $(CLEAR_VARS)
, O* {5 A( o- ?( K$ o$ l( q9 tLOCAL_MODULE    := hello-jni; x# |+ x; S9 f' P4 K# h6 J
8 N* c/ S0 f4 U- I
LOCAL_SRC_FILES := hello-jni.cpp
( w1 x( ?' g  p4 c2 I' i% v + a1 v) I. P! s$ R+ a% @
include $(BUILD_SHARED_LIBRARY)6 ^9 k1 V. M; }/ J2 C
2 P1 z; c$ G! ~7 J' l
2、hello-jni.cpp:4 |1 C  @- i1 Z# f  h
1 J: I' Q+ I" x

' Y2 w: s- ^3 n' J& d2 t" o
+ `$ J! o7 p1 n6 ?7 \+ X 5 q7 o4 j4 B0 v6 e9 v
. D9 o8 @$ m8 U* T+ \4 t. j
#include <string.h>4 y" x8 I3 E' ~5 D$ R
#include <jni.h>
  ^/ H  \$ [# N4 o$ E/ v
: g7 k4 X9 v* Q, n% v1 n#ifdef __cplusplus
' m: M; I+ M5 i0 B: [; wextern "C" {; j2 a. c: o+ |7 ^/ t
#endif
, J7 q, I! q$ P& Y; [2 M  F
* w, q0 p8 X/ {8 v. C( V0 wJNIEXPORT jstring JNICALL Java_com_example_testjni_TestJNIProjectActivity_StringFromJni
" z7 j5 q5 x* I  (JNIEnv * env, jobject thiz)1 Q( N; t- T+ @/ o  H
{
# i; e' I- |2 p; w8 g1 G     return env->NewStringUTF("Hello from JNI !");
) H( X' ~! O8 w( j}" d+ m1 ^8 Q" C" ]

) v  S. U- R, I: Q3 Y#ifdef __cplusplus7 _  [+ H+ A' u0 [; p- t
}
7 M, L0 h! {2 ^2 a+ b#endif
/ B4 S  A, Q" y  K' g; h6 n

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-6-25 00:24 , Processed in 0.062500 second(s), 23 queries , Gzip On.

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

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

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