Android调用Jni,非常简单的一个Demo

step1:创建一个android项目
      Project Name:jnitest
      Build Target: Android 1.6
      Application Name: JNI Test
      Package Name: org.eshock.jnitest
      Create Activity: JNITest

JNITest.java类代码:

  1. import android.app.Activity;  
  2. import android.os.Bundle;  
  3. public class JNITest extends Activity {  
  4.     public native int plus (int x, int y);//这个是需用c语言实现的函数    
  5.       
  6.     /** Called when the activity is first created. */  
  7.     @Override  
  8.     public void onCreate(Bundle savedInstanceState) {  
  9.         super.onCreate(savedInstanceState);  
  10.         int x = plus(1, 2);  
  11.         android.util.Log.d("jni", String.valueOf(x));  
  12.     }  
  13.       
  14.     static {  
  15.         System.loadLibrary("mylib");  
  16.     }  
  17. }  

step2:用C语言实现这个plus函数
           创建<project>/jni/mylib.c: 内容如下 

  1. #include <jni.h>  
  2. #include "JNITest.h"  
  3. #ifdef __cplusplus  //最好有这个,否则被编译器改了函数名字找不到不要怪我  
  4. extern "C" {  
  5. #endif  
  6.   
  7. JNIEXPORT jint JNICALL  
  8. Java_org_eshock_jnitest_JNITest_plus( JNIEnv* env,  
  9.                                                   jobject thiz,  
  10.                                                   jint x,  
  11.                                                   jint y )  
  12. {  
  13.     return x + y;  
  14. }  
  15.   
  16.   
  17. #ifdef __cplusplus  
  18. }  
  19. #endif  

step3:随便在某个目录下创建一个文件JNITest.java:内容如下:

  1. public class JNITest {  
  2.    public native int plus (int x, int y);  
  3. }  

在cmd窗口中进入JNITest类所在的文件路径   然后执行命令:javac JNITest.java && javah JNITest 
将生成一个文件JNITest.h,该文件放到jni目录下面,在bin路径下新建一个header文件夹,把JNITest.h文件复制一份到header文件夹下面:

  1. /* DO NOT EDIT THIS FILE - it is machine generated */  
  2. #include <jni.h>  
  3. /* Header for class JNITest */  
  4.   
  5. #ifndef _Included_JNITest  
  6. #define _Included_JNITest  
  7. #ifdef __cplusplus  
  8. extern "C" {  
  9. #endif  
  10. /* 
  11.  * Class:     JNITest 
  12.  * Method:    plus 
  13.  * Signature: (II)I 
  14.  */  
  15. JNIEXPORT jint JNICALL Java_JNITest_plus  
  16.   (JNIEnv *, jobject, jint, jint);  
  17.   
  18. #ifdef __cplusplus  
  19. }  
  20. #endif  
  21. #endif  

step4:在jni包下创建Android.mk文件

  1. LOCAL_PATH := $(call my-dir)         #LOCAL_PATH表示c源代码文件的位置  
  2.   
  3. include $(CLEAR_VARS)  
  4.   
  5. LOCAL_MODULE    := mylib              #LOCAL_MODULE表示生成的共享库的名称  
  6. LOCAL_SRC_FILES := mylib.c            #LOCAL_SRC_FILES代表c代码的文件  
  7.   
  8. include $(BUILD_SHARED_LIBRARY)  

step5:在jni包下创建Application.mk文件  文件放jni包下
      APP_ABI := armeabi armeabi-v7a mips x86   #定义cpu类型

step6:把jni文件夹下的文件生成.so文件
      (1) 在cmd窗口进入项目所在目录  e:  进入e盘目录
      (2) cd E:\workspace\jnitest    //进入项目所在目录

      (3) E:\workspace\jnitest>ndk-build NDK_MODULE_PATH=jni   //输入命令ndk-build NDK_MODULE_PATH=jni

注意事项:如果ndk环境变量没有配置,需要配置ndk环境变量

            变量名:NDK_MODULE_PATH
            变量值:C:\android-ndk-r9b   (根据安装路径进行调整)

            添加到path路径:  %NDK_MODULE_PATH%;
            如果path路径下没有冒号,自己添加一个

时间: 2024-08-03 14:32:26

Android调用Jni,非常简单的一个Demo的相关文章

【我的Android进阶之旅】Android调用JNI出错 java.lang.UnsatisfiedLinkError: No implementation found for的解决方法

错误描述 今天使用第三方的so库时候,调用JNI方法时出现了错误.报错如下所示: 11-01 16:39:20.979 4669-4669/com.netease.xtc.cloudmusic E/art: No implementation found for void com.netease.xtc.cloudmusic.utils.NeteaseMusicUtils.nativeInit(android.content.Context) (tried Java_com_netease_xt

Android NDK环境搭建及调用JNI的简单步骤

转载请注明:http://www.cnblogs.com/tiantianbyconan/p/3396595.html Java Native Interface (JNI)标准是java平台的一部分,它允许Java代码和其他语言写的代码进行交互.JNI 是本地编程接口,它使得在 Java 虚拟机 (VM) 内部运行的 Java 代码能够与用其它编程语言(如 C.C++ 和汇编语言)编写的应用程序和库进行交互操作. 1. 下载NDK(http://developer.android.com/to

Android下调用jni时进行的转码操作的例子

之前帮人家解决乱码问题时回过一个帖子 现在总结在博客里 留起来 bool handleString(char* name) { jstring rtnname = 0; int slenname = strlen(name); unsigned short * namebuffer = 0; if( slenname == 0 ) rtnname = mEnv->NewStringUTF(name); else { wchar_t* wname = NULL; setlocale(LC_ALL,

Android实现调用系统相册和拍照的Demo示例_Android

本文讲述了Android实现调用系统相册和拍照的Demo示例.分享给大家供大家参考,具体如下: 最近我在群里看到有好几个人在交流说现在网上的一些Android调用系统相册和拍照的demo都有bug,有问题,没有一个完整的.确实是,我记得一个月前,我一同学也遇到了这样的问题,在低版本的系统中没问题,用高于4.4版本的系统就崩溃.所以,我还是想提取出来,给大家整理一下,一个比较完整无bug的demo,让大家收藏,留着以后用. 其实对于调用手机图库,高版本的系统会崩溃,是因为获取方法变了,所以我们应该

Android实现调用系统相册和拍照的Demo示例

本文讲述了Android实现调用系统相册和拍照的Demo示例.分享给大家供大家参考,具体如下: 最近我在群里看到有好几个人在交流说现在网上的一些Android调用系统相册和拍照的demo都有bug,有问题,没有一个完整的.确实是,我记得一个月前,我一同学也遇到了这样的问题,在低版本的系统中没问题,用高于4.4版本的系统就崩溃.所以,我还是想提取出来,给大家整理一下,一个比较完整无bug的demo,让大家收藏,留着以后用. 其实对于调用手机图库,高版本的系统会崩溃,是因为获取方法变了,所以我们应该

Android For JNI(六)——交叉编译,NDK概述以及文件结构,编写自己的第一个JNI工程

Android For JNI(六)--交叉编译,NDK概述以及文件结构,编写自己的第一个JNI工程 终于回到我们的 android了,我们先要配置这个NDK的环境,但是之前,我们还要了解一下基本的术语 一.交叉编译 在一个平台下编译出另一个平台可以执行的二进制程序 CPU平台:ARM X86 MIPS(指令集) 系统平台:windows linux mac 原理:模拟另一个平台的特性去编译程序 源代码-->预编译-->编译-->链接-->可执行程序 工具链:一个工具使用自动调用下

关于Android高德地图的简单开发实例代码(DEMO)_Android

废话不多说了,直接给大家上干货了. 以下为初次接触时 ,练手的DEMO import android.app.Activity; import android.app.ProgressDialog; import android.content.ContentValues; import android.database.Cursor; import android.database.SQLException; import android.database.sqlite.SQLiteDatab

关于Android高德地图的简单开发实例代码(DEMO)

废话不多说了,直接给大家上干货了. 以下为初次接触时 ,练手的DEMO import android.app.Activity; import android.app.ProgressDialog; import android.content.ContentValues; import android.database.Cursor; import android.database.SQLException; import android.database.sqlite.SQLiteDatab

Android通过JNI调用驱动程序(完全解析实例)

  [置顶] Android通过JNI调用驱动程序(完全解析实例)            要达到的目的:android系统中,用JAVA写界面程序,调用jni中间库提供的接口,去操作某个驱动节点,实现read,writer ioctl等操作!这对底层驱动开发人员是很重要的一个调试通道,也是android 系统下提供一些特殊功能接口的方法! 本文前提:我们假设已经写了一个驱动程序,它是控制LED的亮灭的,并且创建了一个节点:/dev/vib,也就是通过open这个vib节点,可以read/writ