一. 项目使用
1.配置环境变量
打开 /Users/md313 下的文件 .bash_profile,设置路径 export PATH=/Users/md313/Documents/androidspace/android-ndk-r8c:$PATH
2.项目里编译(配置好的)
cd /Users/md313/
source .bash_profile
cd 项目目录ndk-build
编译完成————————————————————————————————————————————————————————————————————————————
二. 一个简单的JNI例子
下面用一个简单的例子介绍怎么生成一个.so文件以及在Android项目中怎么调用.so文件。
① 首先,用Eclipse建立一个ANDROID的工程,命名为JNITest,建议一个jni调用的类封装native method
package jni.sam.you;
public class MyJNI
{
public native int numPlus(int a,int b);
static{
System.loadLibrary("hellojni");
}
}
打开终端,cd命令到eclipse工程目录下bin目录,我的是E:\androidworkspace\JNITest\bin\classes
键入javah -jni jni.sam.you.MyJNI 来编译eclipse生成的.class文件
可以生成jni_sam_you_MyJNI.h这个文件的主要作用就是生成函数名,把这个函数名拷出来这个文件就可以删了。
jni_sam_you_MyJNI.h
/* DO NOT EDIT THIS FILE - it is machinegenerated */
#include <jni.h>
/* Header for class jni_sam_you_MyJNI */
#ifndef _Included_jni_sam_you_MyJNI
#define _Included_jni_sam_you_MyJNI
#ifdef __cplusplus
extern "C" {
#endif
/*
*Class: jni_sam_you_MyJNI
*Method: numPlus
*Signature: (II)I
*/
JNIEXPORT jint JNICALLJava_jni_sam_you_MyJNI_numPlus
(JNIEnv *, jobject, jint, jint);
#ifdef __cplusplus
}
#endif
#endif
然后将这个函数名拷贝出来实现他的函数体
jni_sam_you_MyJNI.c
/* DO NOT EDIT THIS FILE - it is machinegenerated */
#include <jni.h>
/*
*Class: jni_sam_you_MyJNI
*Method: numPlus
*Signature: (II)I
*/
JNIEXPORT jint JNICALLJava_jni_sam_you_MyJNI_numPlus
(JNIEnv *env, jobject jj, jint a, jint b)
{
returna+b;
}
注意:参数名一定要补全,不然编译不通过
在项目根目录新建jni文件夹,把 .h 和.c文件考入,然后新建Android.mk和application.mk文件,(直接拷贝),打开application.mk文件查看,打开Android.mk文件,设置好编译路径等,
cd到项目目录,执行ndk-build命令,编译完毕后, 进入eclipse,在项目工程上右键Refresh,多出了 lib和obj文件夹,在入口activity load编译好的库
System.loadLibrary("rtmp"); 之后调用即可。
![](https://img-my.csdn.net/uploads/201203/30/1333080007_8698.jpg)
在主activity里调用native method
package jni.sam.you;
import android.app.Activity;
import android.os.Bundle;
public class Main extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
static
{
System.loadLibrary("hellojni");
}
@Override
protected void onResume() {
super.onResume();
System.out.println("###########");
System.out.println(newMyJNI().numPlus(2, 3));
}
}
从logcat里即可看到对应结果
![](https://img-my.csdn.net/uploads/201203/30/1333080036_6458.jpg)