最近研究了一下android jni的用法,JNI全称为Java Native Interface(JAVA本地调用)。从Java1.1开始,JNI成为java平台的一部分,它允许Java代码和其他语言写的代码(如C&C++)
进行交互。并非从Android发布才引入JNI的概念的。要实现JNI编程,首先要准备工具,我的是平时用的android开发环境,sdk eclipse,另外又下载了一个ndk.
简单来说,Android的NDK提供了一些交叉编译工具链和Android自带的库,这些Android的库可以让开发者在编写本地语言的程序时调用。
而NDK提供的交叉编译工具链就对已经编写好的C&C++代码进行编译,生成库。
当然了,你也可以自己搭建交叉编译环境,而不用NDK的工具和库。然后生成库,只要规范操作,一样可以生成能让JAVA层成功调用的库文件的。
我是从网上下载的android-ndk32-r10b-windows-x86版本,放到一个文件夹下解压,注意路径中尽量不要用中文。
3、JNI 调用流程
1、首先先在eclipse上新建一个工程,命名为 JniDemo 我是保存在了E:\demo\JniDemo
2、重新创建一个类,我命名为JniUtils,在这个类里声明一个方法
public class JniUtils {
public static native String getStringFromC();
}
3、在MainActivity中引用此方法
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.i("msg", "ddd:" + JniTest.getStringFromC());
}
}
4、在工程下添加 jni 的文件,新建一个Android.mk文件,我需要交互的是c++语言,我的Android.mk如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := JniDemo
LOCAL_SRC_FILES := JniDemo.cpp
include $(BUILD_SHARED_LIBRARY)
若为C语言交互,Android.mk如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := JniDemo
LOCAL_SRC_FILES := JniDemo.c
include $(BUILD_SHARED_LIBRARY)
其中module为即将生产的.so包名,在java代码里需要引用此包名,files是对应要新建的C/C++文件名
添加到Android.mk文件,再继续在jni文件夹里添加.c/.cpp文件,文件名为files对应的名字
5、添加ndk路径,在eclipse的Windows->Preferences下Android->NDK下有NDK Location选项,选则解压的ndk的路径
在eclipse的Project->Properties下选择Builders下选择new,在弹窗选择Program进到设置页面
Location选择ndk的路径\ndk-build.cmd
Working Directory选择工程所在的目录
然后选择第二项Refresh 进行相应配置
选择第4项Build Options进行相应配置
6、打开工程所在文件夹,进入bin->classes 进入E:\demo\JniDemo\bin\classes\com\example\jnidemo查看是否有native方法
所在文件的.class文件,
cmd运行环境,进到classes所在的目录,执行javah com.example.jnidemo.JniUtils在classes下回生成.h文件,将此文件
复制到eclipse的jni文件夹下
7、编写c文件,如下
JNIEXPORT jstring JNICALL Java_com_example_jnidemo_JniUtils_getStringFromC(JNIEnv * env, jclass obj){
//java to c
return env->NewStringUTF("this is c++ code");
}
8、最后在MainActivity中添加引用包
static {
System.loadLibrary("JNIDemo");
}
9、运行,打印出this is c++ code.
进行交互。并非从Android发布才引入JNI的概念的。要实现JNI编程,首先要准备工具,我的是平时用的android开发环境,sdk eclipse,另外又下载了一个ndk.
简单来说,Android的NDK提供了一些交叉编译工具链和Android自带的库,这些Android的库可以让开发者在编写本地语言的程序时调用。
而NDK提供的交叉编译工具链就对已经编写好的C&C++代码进行编译,生成库。
当然了,你也可以自己搭建交叉编译环境,而不用NDK的工具和库。然后生成库,只要规范操作,一样可以生成能让JAVA层成功调用的库文件的。
我是从网上下载的android-ndk32-r10b-windows-x86版本,放到一个文件夹下解压,注意路径中尽量不要用中文。
3、JNI 调用流程
1、首先先在eclipse上新建一个工程,命名为 JniDemo 我是保存在了E:\demo\JniDemo
2、重新创建一个类,我命名为JniUtils,在这个类里声明一个方法
public class JniUtils {
public static native String getStringFromC();
}
3、在MainActivity中引用此方法
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.i("msg", "ddd:" + JniTest.getStringFromC());
}
}
4、在工程下添加 jni 的文件,新建一个Android.mk文件,我需要交互的是c++语言,我的Android.mk如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := JniDemo
LOCAL_SRC_FILES := JniDemo.cpp
include $(BUILD_SHARED_LIBRARY)
若为C语言交互,Android.mk如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := JniDemo
LOCAL_SRC_FILES := JniDemo.c
include $(BUILD_SHARED_LIBRARY)
其中module为即将生产的.so包名,在java代码里需要引用此包名,files是对应要新建的C/C++文件名
添加到Android.mk文件,再继续在jni文件夹里添加.c/.cpp文件,文件名为files对应的名字
5、添加ndk路径,在eclipse的Windows->Preferences下Android->NDK下有NDK Location选项,选则解压的ndk的路径
在eclipse的Project->Properties下选择Builders下选择new,在弹窗选择Program进到设置页面
Location选择ndk的路径\ndk-build.cmd
Working Directory选择工程所在的目录
然后选择第二项Refresh 进行相应配置
选择第4项Build Options进行相应配置
6、打开工程所在文件夹,进入bin->classes 进入E:\demo\JniDemo\bin\classes\com\example\jnidemo查看是否有native方法
所在文件的.class文件,
cmd运行环境,进到classes所在的目录,执行javah com.example.jnidemo.JniUtils在classes下回生成.h文件,将此文件
复制到eclipse的jni文件夹下
7、编写c文件,如下
JNIEXPORT jstring JNICALL Java_com_example_jnidemo_JniUtils_getStringFromC(JNIEnv * env, jclass obj){
//java to c
return env->NewStringUTF("this is c++ code");
}
8、最后在MainActivity中添加引用包
static {
System.loadLibrary("JNIDemo");
}
9、运行,打印出this is c++ code.