欢迎转载,转载请注明出处:http://www.cnblogs.com/lanrenxinxin/p/4696991.html
开始接触Android JNI层面的内容,推荐一本不错的入门级的书《Android的设计与实现:卷一》,这两天看了一下关于Java层和Native层函数映射的章节,加深对JNI的理解。
先是写了一个非常简单的计算器,关键的运算放在Native层实现,然后把运算的结果返回到Java层,写这个的时候还是自己手动建jni文件夹,javah的命令行,写makefile文件,用ndk-build命令行来编译,后来发现要调试C代码了,才发现高版本的ndk环境已经全都集成好了,编译,运行,调试甚至和VS差不多方便,只是自己没配好而已。
下面是非常简单的计算器源码,只是用来熟悉JNI的基本语法,其中我自己碰到过的一个问题,就是LoadLibrary()调用之后,程序直接崩溃,最开始以为是模拟器是x86的模式,而编译的so文件是arm的模式,但是将模拟器改成arm之后还是崩溃,最后无奈在自己手机上测试也是如此,一打开就直接崩溃,在网上能找到的各种方法都试了,最后发现是so命名的问题具体可以参考这篇博客Android Eclipse JNI 调用 .so文件加载问题
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content"> <TextView android:id = "@+id/tvResult" android:layout_width="fill_parent" android:layout_height="wrap_content" android:height="40dp"/> </LinearLayout> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content"> <Button android:id="@+id/btnBackSpace" android:layout_width="wrap_content" android:layout_height="wrap_content" android:width="150dp" android:text = "@string/strbtnbackspace" /> <Button android:id="@+id/btnCE" android:layout_width="wrap_content" android:layout_height="wrap_content" android:width="150dp" android:text="@string/strbtnCE"/> </LinearLayout> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content"> <Button android:id="@+id/btn7" android:layout_width = "wrap_content" android:layout_height="wrap_content" android:width="75dp" android:text="@string/strbtn7"/> <Button android:id="@+id/btn8" android:layout_width = "wrap_content" android:layout_height="wrap_content" android:width = "75dp" android:text="@string/strbtn8"/> <Button android:id="@+id/btn9" android:layout_width="wrap_content" android:layout_height="wrap_content" android:width = "75dp" android:text="@string/strbtn9"/> <Button android:id="@+id/btnADD" android:layout_width="wrap_content" android:layout_height="wrap_content" android:width = "75dp" android:text="@string/strbtnADD"/> </LinearLayout> <LinearLayout android:layout_width="fill_parent" android:layout_height = "wrap_content"> <Button android:id="@+id/btn4" android:layout_width="wrap_content" android:layout_height = "wrap_content" android:width="75dp" android:text="@string/strbtn4"/> <Button android:id="@+id/btn5" android:layout_width="wrap_content" android:layout_height="wrap_content" android:width="75dp" android:text="@string/strbtn5"/> <Button android:id="@+id/btn6" android:layout_width = "wrap_content" android:layout_height="wrap_content" android:width="75dp" android:text="@string/strbtn6"/> <Button android:id="@+id/btnSUB" android:layout_width="wrap_content" android:layout_height="wrap_content" android:width = "75dp" android:text="@string/strbtnSUB"/> </LinearLayout> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content"> <Button android:id="@+id/btn1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:width="75dp" android:text="@string/strbtn1"/> <Button android:id="@+id/btn2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:width="75dp" android:text="@string/strbtn2"/> <Button android:id="@+id/btn3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:width="75dp" android:text="@string/strbtn3"/> <Button android:id="@+id/btnMUL" android:layout_width="wrap_content" android:layout_height="wrap_content" android:width = "75dp" android:text="@string/strbtnMUL"/> </LinearLayout> <LinearLayout android:layout_width = "fill_parent" android:layout_height="wrap_content"> <Button android:id="@+id/btn0" android:layout_width="wrap_content" android:layout_height="wrap_content" android:width = "75dp" android:text="@string/strbtn0"/> <Button android:id="@+id/btnC" android:layout_width="wrap_content" android:layout_height="wrap_content" android:width = "75dp" android:text="@string/strbtnC"/> <Button android:id="@+id/btnRESULT" android:layout_width="wrap_content" android:layout_height="wrap_content" android:width = "75dp" android:text="@string/strbtnRESULT"/> <Button android:id="@+id/btnDIV" android:layout_width="wrap_content" android:layout_height="wrap_content" android:width = "75dp" android:text="@string/strbtnDIV"/> </LinearLayout> </LinearLayout>