文章目录
上篇文章我们对java调用c++代码做了详细介绍,安卓之JNI 和 NDK编程(五)java调用c++代码详细介绍
这篇文章我们写一个native方法,多加两个参数实现一个加法的运算!
(1)新建Jni类、定义natvie方法
如果你要使用c++ 来写一些底层的库,要用java来调用的话,
我的建议是最好先写一个java类,如我这里写了一个Jni类
这个类如果将来你有多少ndk方法,就可以在类里面定义这些native方法,
封装在这个类里面,然后这个类做成单例的。
package com.luminal.ndktest;
/**
* 用来封装Jni的native接口的
*/
public class Jni {
//因为有很多地方要调用到,所以写成单例
private static Jni obj = new Jni();
public static Jni instance()
{
return obj;
}
//加载动态库
static {
//动态库的名字,参见"CMakeLists.txt"文件
System.loadLibrary("native-lib");
}
public native int add(int a, int b);
}
(2)写对应的c++方法
#include <jni.h>
#include <string>
extern "C" jint Java_com_luminal_ndktest_Jni_add(JNIEnv* env, jobject obj, jint x, jint y){
return x + y;
}
(3)MainActivity调用
package com.luminal.ndktest;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
int num = Jni.instance().add(111,888);
TextView tv = (TextView) findViewById(R.id.sample_text);
tv.setText(String.valueOf("计算出来的结果为:"+num));
Log.v("MainActivityTag",num+"");
}
}
(4)Android映射 Jni 的规范写法
示例1
返回值对应:String 对应 jstring
方法名对应:getStringFromJni 对应 Java_com_luminal_ndktest_Jni_getStringFromJni
参数对应:Jni总要比Android要多这两个参数:JNIEnv* env, jobject obj
示范2
返回值对应:int 对应 jint
方法名对应:add 对应 Java_com_luminal_ndktest_Jni_add
参数对应:Jni总要比Android要多这两个参数:JNIEnv* env, jobject obj
java和c++参数名可以不一样,如:java写的 int a, int b, c++写的 jint x, jint y
常见类型映射
String --->jstring
double --->jdouble
int --->jint
我们也可以,选中jstring,右击 Go To,Declaration,查看Jni的类型