step1:创建一个android项目

      Project Name:jnitest

      Build Target: Android 1.6

      Application Name: JNI Test

      Package Name: org.eshock.jnitest

      Create Activity: JNITest

JNITest.java类代码:

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

step2:用C语言实现这个plus函数

           创建<project>/jni/mylib.c: 内容如下

#include <jni.h>
#include "JNITest.h"
#ifdef __cplusplus //最好有这个,否则被编译器改了函数名字找不到不要怪我
extern "C" {
#endif JNIEXPORT jint JNICALL
Java_org_eshock_jnitest_JNITest_plus( JNIEnv* env,
jobject thiz,
jint x,
jint y )
{
return x + y;
} #ifdef __cplusplus
}
#endif

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

     public class JNITest {
public native int plus (int x, int y);
}

在cmd窗口中进入JNITest类所在的文件路径   然后执行命令:javac JNITest.java && javah JNITest

将生成一个文件JNITest.h,该文件放到jni目录下面,在bin路径下新建一个header文件夹,把JNITest.h文件复制一份到header文件夹下面:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class JNITest */ #ifndef _Included_JNITest
#define _Included_JNITest
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: JNITest
* Method: plus
* Signature: (II)I
*/
JNIEXPORT jint JNICALL Java_JNITest_plus
(JNIEnv *, jobject, jint, jint); #ifdef __cplusplus
}
#endif
#endif

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

      LOCAL_PATH := $(call my-dir)         #LOCAL_PATH表示c源代码文件的位置

      include $(CLEAR_VARS)

      LOCAL_MODULE    := mylib              #LOCAL_MODULE表示生成的共享库的名称
LOCAL_SRC_FILES := mylib.c #LOCAL_SRC_FILES代表c代码的文件 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路径下没有冒号,自己添加一个

点击下载源码

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

  1. Android调用系统相册和拍照的Demo

    最近我在群里看到有好几个人在交流说现在网上的一些Android调用系统相册和拍照的demo都有bug,有问题,没有一个完整的.确实是,我记得一个月前,我一同学也遇到了这样的问题,在低版本的系统中没问题 ...

  2. Android调用JNI本地方法跟踪目标代码

    正如Android调用JNI本地方法经过有点改变章所说跟踪代码是可行的,但是跟踪某些代码会出现anr,点击取消,还是不好运,有提高办法吗?回答是有(gdb还没试过,本文只讨论ida). 下面是我使用  ...

  3. Android Studio JNI 开发简单案例

    转载:http://www.androidchina.net/5744.html 进程保活,热修复,硬件接入等等都需要底层的支持,而底层代码是 C .C++ 写的,那么在 Android 中怎么调用底 ...

  4. Xamarin.Android再体验之简单的登录Demo

    一.前言 在空闲之余,学学新东西 二.服务端的代码编写与部署 这里采取的方式是MVC+EF返回Json数据,(本来是想用Nancy来实现的,想想电脑太卡就不开多个虚拟机了,用用IIS部署也好) 主要是 ...

  5. 【我的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/a ...

  6. Android调用JNI本地方法经过有点改变

    方法注册好后要经过哪些路 Android一个异常捕获项目 https://github.com/xroche/coffeecatch coffeecatch CoffeeCatch, a tiny n ...

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

    转载请注明:http://www.cnblogs.com/tiantianbyconan/p/3396595.html Java Native Interface (JNI)标准是java平台的一部分 ...

  8. Xamarin.Android之封装个简单的网络请求类

    一.前言 回忆到上篇 <Xamarin.Android再体验之简单的登录Demo> 做登录时,用的是GET的请求,还用的是同步, 于是现在将其简单的改写,做了个简单的封装,包含基于Http ...

  9. 手把手教你通过Eclipse工程配置调用JNI完全攻略

    本文地址:http://www.cnblogs.com/wavky/p/JNI.html 当你找到并鬼使神差地打开这个博文的时候,我敢肯定你已经知道什么是JNI,基本概念就不粘贴了. 百度出来的JNI ...

随机推荐

  1. linux platform设备与驱动

    struct platform_driver { int (*probe)(struct platform_device *); int (*remove)(struct platform_devic ...

  2. STM32_RTC君

    五一假期已过,大家是否还像五一五二五三那样快乐呢??答案就交给你们自己寻找了哈..说到五一..就从五一开始的那一刻起..就开始计时着..到五一假期结束..呵呵..在这里,智商和情商比我高的人估计又猜到 ...

  3. 深入浅出 妙用Javascript中apply、call、bind

    apply.call 在 javascript 中,call 和 apply 都是为了改变某个函数运行时的上下文(context)而存在的,换句话说,就是为了改变函数体内部 this 的指向. Jav ...

  4. Devexpress treeList

    1.数据绑定最基本的两个属性:KeyFieldName和ParentFieldName. SELECT OfficeID,OfficeName,ParentOfficeID FROM tOffice ...

  5. laravel中TokenMismatchException异常处理

    在使用post或者put等方法请求时,有时会报TokenMismatchException in VerifyCsrfToken.php line 67错误.原因是laravel默认开启了防CSRF. ...

  6. Android中Intent的用法总结

    Intent只在Android中特有,我把它比作一种运载工具,就像飞机一样,会把一些人带到某个地方,而且如果需要的话,还可以找到机上有哪些人员(数据),这就需要另外一些设备来支持(如:Bundle), ...

  7. ant 自动化编译

    bulid.xml配置: <?xml version="1.0" encoding="UTF-8" ?> <project name=&quo ...

  8. 升级为iOS9后,默认请求类型为https,如何使用http进行请求会报错(引用他人的)

    升级为iOS9后,默认请求类型为https,如何使用http进行请求会报错 The resource could not be loaded because the App Transport Sec ...

  9. PreparedStatement的应用

    package it.cast.jdbc; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql ...

  10. HTTPS工作原理

    HTTPS是什么 HTTPS全称为Hypertext Transfer Protocol over Secure Socket Layer,及以安全为目标的HTTP通道,简单说就是HTTP的安全版本. ...