由于Android系统是搭建在Linux之上的,所以想调用jni的话必须把c++动态链接库编译为so。
第一步,windows下的linux环境准备,先装一个cygwin。
安装步骤我就不多说了,网上有很多参考例子。这里我给大家介绍个国内比较快的镜像地址:
http://mirrors.sohu.com/cygwin/
安装cygwin需要很久,这个镜像地址我是花了半天装完的。值得注意的是中途如果网络出了问题
或者其他原因导致安装中断了。把那个devel-default改为devel-reinstall这样就会续装而不是重
装,可以节省很多时间。总的来说cygwin的安装还是比较容易的,只是要花不少时间而已。
第二步,下载android ndk。
我这里用的是目前最新的版本android-ndk-r5b。从r4以后就跟原来的
不一样了。安装方法也不一样。下载这个需要翻(和谐)墙大家都懂的。下载完以后把压缩文件随便解压到一个
目录。解压就行了不需要像之前的版本还要安装一下。
第三步,配置ndk和cygwin。
假如我的cygwin安装目录是C:\cygwin-install。找到C:\cygwin-install\home\alex.ren下的.bash_profile文件。
打开并添加一行:NDK=/cygdrive/f/android-ndk-r5b。我的android-ndk-r5b安装在f盘下面。(F:\android-ndk-
r5b,注意这个是ndk的根目录)。
第四步,写个jni调用的小例子。
打开eclipse新建一个android的工程。没什么特别的默认填写工程名,activity名字,包名。
我的包名为:com.hello.jni。在这个包下面创建一个JniTest类。
写道
package com.hello.jni;
public class JniTest {
public native String get();
static {
System.loadLibrary("jnitest");
}
}
第五步,生存Jni头文件。
首先生存jni的头文件。通过命令 javah -jni com.hello.jni.JniTest。在执行这个命令之前要先准备下面这些步骤。
1.由于eclipse默认把java class编译文件放在bin目录下,源文件在src目录下。所以需要把JniTest.class拷到
工程目录/src/com/hello/jni下面。如果JniTest类引用到了其他的class那么把其他所有引用到的class都拷到下面去。
2.最容易忽视掉的一点是上面那个javah命令需要在你的工程目录/src下面执行。不然会报找不到文件的错误。
第六步,准备Jni源文件
其实上面那个jni头文件要不要都无所谓,我们需要的是生存的那个JniTest类里面get方法在jni下面的格式。
在你的android工程目录下面建立一个jni目录。添加如下两个文件:
Android.mk
写道
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := jnitest
LOCAL_SRC_FILES := jnitest.c
include $(BUILD_SHARED_LIBRARY)
jnitest就是生成的so模块名,jnitest.c就是c源文件。
jnitest.c
写道
#include <string.h>
#include <jni.h>
/* This is a trivial JNI example where we use a native method
* to return a new VM String. See the corresponding Java source
* file located at:
*
*/
jstring
Java_com_hello_jni_JniTest_get( JNIEnv* env, jobject thiz )
{
return (*env)->NewStringUTF(env, "Hello from my JNI test!");
}
Java_com_hello_jni_JniTest_get,注意下这个函数的命名格式,我是直接从头文件里面copy过来的。别搞错了不然
没法调用的。(这个c文件写好后我把头文件删除掉了反正也没用到)
第七步,生成so库
在你的工程目录/jni下执行命令:$NDK/ndk-build。这个命令执行成功后会在你的工程目录下生成libs/armeabi/libjnitest.so文件。这个就是要在android下调用的jni库。
第八步,在android里面调用这个jni库函数
写道
package com.hello.jni;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
public class HelloJni extends Activity {
private JniTest jni;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
jni = new JniTest();
/* Create a TextView and set its content.
* the text is retrieved by calling a native
* function.
*/
TextView tv = new TextView(this);
tv.setText( jni.get() );
setContentView(tv);
}
}
大功告成
分享到:
相关推荐
android-ndk(android-ndk-r26b-windows.zip)适用于Windows系统
android-ndk(android-ndk-r25b-windows.zip)适用于Windows系统
android-ndk(android-ndk-r25b-linux.zip)适用于Linux系统
android-ndk-r5c-windows.zip
android-ndk(android-ndk-r23b-windows.zip)适用于Windows系统
android-ndk-r13b-windows-x86_64 稳定版 platforms包含9-24
android-ndk(android-ndk-r25b-darwin.zip)适用于macOS系统
android-ndk-r18b-linux-x86_64.zip https://dl.google.com/android/repository/android-ndk-r18b-linux-x86_64.zip
老版本的ndk,版本号是android-ndk-r9-windows-x86_64
android-ndk-r16b-windows-x86_64.zip 在谷歌开发者官网下的,因为被墙了,所以做个备份
android-sdk_r24.4.1-windows和android-ndk-r10e-windows-x86_64。文件太大只能传到百度云上
64位windows下ndk,方便直接使用。cygwin+ndk+FFmpeg配合使用,编译Android 动态库进行视频编辑。
可用于安卓 qt开发 安卓NDK android-ndk-r12b-windows-x86_64
android ndk r18b for windows. 安卓版SDK的NDK,用来编译C程序用的,windows版,官方原版
android-ndk-r7-windows android-ndk-r7-windows android-ndk-r7-windows
android-ndk-r5b-windows,ndk开发,解压即可,绝对能用!
android-ndk-r16b, Android studio jni开发用ndk 包. 文件为网盘地址及密码
老版本的ndk,版本号为android-ndk-r9d-windows-x86_64,保存起来以备不时之需。
1、支持arm 2、支持aarch64
android-ndk-r23-windows 安卓环境下载