Android 应用程序可以用C++开发,但是C++并不友好,所以JNI应运而生,有了JNI就可以使用JAVA来调用C++的函数,我也是总结一些各位博客大神经验了呵呵。
废话不多说开始准备工具adt和ndk包吧,全部放在自己百度云里或优快云连接
1.adt-bundle-windows-x86_64-20140702.exe 下载地址
2.android-ndk-r10e-windows-x86_64.exe 下载地址
3.com.android.ide.eclipse.ndk_23.0.2.1259578.jar 下载地址
第一步:安装好adt并搭建好一般的android开发环境,这里用的是SDK android-19也就是android4.4.2
第二步:把com.android.ide.eclipse.ndk_23.0.2.1259578.jar 放入到 “你的ADT安装目录\eclipse\plugins\com.android.ide.eclipse.ndk_23.0.2.1259578.jar”
第三步:安装 android-ndk-r10e-windows-x86_64.exe,添加环境变量 NDK_ROOT 指向NDK的安装目录(也有时发现不设置环境变量也可以)
以上工作做好后可以打开你的Eclipse配置一下自己的NDK路径了
接下来开始首先建一个普通的工程,右键Android Tools->Add Native Support,然后会提示你生成一些JNI相关的文件夹
目录下多了一个jni文件,而且文件下还有一个.cpp,和.mk文件
这个cpp文件就是用给我们写C++函数库的,以便于调用,我们给cpp文件写一个简单函数
#include <jni.h>
extern "C"
JNIEXPORT jstring JNICALL Java_com_example_hellondk_MainActivity_stringFromJNI(JNIEnv *env,jobject thiz)
{
return env->NewStringUTF("123HelloWorld123");
}
注意函数名命名必须是Java+ 包名+类名+ 函数名且中间必须以下划线隔开,这样一个函数就能被java里的指定的这个类所调用了
为了调试还在要jni文件夹中加一个Application.mk文件
APP_OPTIM := debug
APP_PLATFORM := android-14
APP_ABI := armeabi-v7a
再来写JAVA那边的函数
Layout就放一个按钮
<Button
android:id="@+id/jnitbn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="JNI" />
MainActivty中点这个按钮就调用C++的stringFromJNI
package com.example.hellondk;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Toast;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.jnitbn).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
String text=stringFromJNI();
Toast.makeText(MainActivity.this, text, Toast.LENGTH_LONG).show();
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
public native String stringFromJNI();
static {
System.loadLibrary("TestNdk");
}
}
这样调用是OK的,但是你会发现断点还是进不去,为什么呢
因为还在这里加参数
ndk-build NDK_DEBUG=1 编译为可调试版的二进制文件
ndk-build NDK_DEBUG=0 编译为release版
ndk-build V=1 执行ndk-build且打印出它所执行的详细编译命令
这样在C++里打的断点就有效了,还真不容易。附上最终源码:下载地址