android如何配置jni,Android JNI配置及入门

JNI是一种可以在Java中调用C/C++代码的技术,也就是说可以在Android上使用C/C++来开发。但是并不能用纯C/C++来开发Android应用,因为这些C/C++代码要通过Java定义的接口来调用。

我试验Android上的JNI时使用的是NDK-R10,不需要Cygin,使用版本较低的NDK时请另寻教程。

NDK的安装与ADT中如何配置NDK

可以到Android Developer官网上去下载最新的NDK工具包,下载下来之后解压到随便一个好找的目录,比如我们解压到了C:\,这样NDK就被安装在了C:\android-ndk-r10目录中。

要在你的Android工程使用NDK还需要进行配置,配置的方法非常简单:

在eclipse ADT中,点开Window->Preference->Andorid->NDK,然后在NDK Location中填入你安装NDK的目录,也就是上面的C:\android-ndk-r10。现在ADT就可以根据你提供的NDK路径自动调用跟构建NDK项目相关的工具了。

试试第一个NDK程序

1. 首先在eclipse ADT中创建一个名为NDKTest的Android项目。

2. 在ADT中你要使用NDK的工程目录上(这里也就是NDKtest目录),鼠标右键后选择Android Tools->Add Native Support...

0818b9ca8b590ca3270a3433284dd417.png

在弹出的对话框中填入你将要生成的二进制链接库的文件名,这里我们以hello.so为例

0818b9ca8b590ca3270a3433284dd417.png

然后单击finish,稍等一会儿,就会发现在你的工程目录里多了一叫jni的文件夹。

0818b9ca8b590ca3270a3433284dd417.png

3. 现在就可以开始写最终起作用那部分的C/C++代码了,这些代码都要写在hello.cpp里面(这个cpp文件的文件名和你刚才要创建的.so的链接库的文件名一样),我们在cpp中写入如下代码:

#include

#include

// C/C++定义的方法必须为Java+包名+activity名+你的函数名,每个部分之间要用下划线_来连接,

// 而且参数也是固定的。所以定义C/C++函数的固定格式为:

// Java_PackageName_ActivityName_function(JNIEnv* env, jobject obj) {...}

//

// 这里extern "C"是为了防止C++编译二进制链接库时对函数进行改名,其实加不加都不影响这段实现代码的运行效果,

// 但是如果你的程序因为java.lang.UnsatisfiedLinkError: Native method not found这

// 错误而崩溃的话你还是加上吧。

extern "C" jstring Java_com_example_ndktest_MainActivity_hello(JNIEnv* env, jobject obj) {

return env->NewStringUTF("hello JNI.");

}

代码中的注释已经说明的非常明白了,你定义的C/ C++函数都要按照固定的格式来命名。

在你点击run按钮来运行你的app时ADT会自动调用ndk-build来编译我们的C/C++代码。

4. 要调用我们写好的C/C++代码,需要我们在Java源码中加入如下代码片:

public class MainActivity extends Activity {

// 因为static块比其他代码都更优先加载,所以在这里我们导入我们的动态链接库

// 记得之前让你自己填写的.so文件名吧,这里你把文件名写上就可以导入了

static {

System.loadLibrary("hello");

}

// 要使用自己定义的C/C++函数要像这样在Java代码中定义一个空方法

// 返回值和你之前定义的C/C++函数返回的类型一样,函数名和C/C++函数名

// 最后那一部分就可以了,因为最后一部分才是函数名

public native String hello();

...

}

5. 这样一来我们的C/C++代码和Java调用接口都准备好了, 我们可以测试一下。

在MainActivity的xml布局代码中加入如下代码:

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:paddingBottom="@dimen/activity_vertical_margin"

android:paddingLeft="@dimen/activity_horizontal_margin"

android:paddingRight="@dimen/activity_horizontal_margin"

android:paddingTop="@dimen/activity_vertical_margin"

tools:context=".MainActivity" >

android:id="@+id/display"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="@string/hello_world" />

然后在Java代码中加入如下部分:

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

((TextView) findViewById(R.id.display)).setText(hello());

}

运行后的效果:

0818b9ca8b590ca3270a3433284dd417.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值