ndk学习17: jni之Java调用C&C++
一.Hello World
1. 定义函数原型
native关键字定义的函数即为jni函数
2.生成头文件
切换到src目录执行: (这个过程可以写脚本自动完成,比如自动拷贝到jni目录)
javah -jni 包名.类名
在根目录下生成:
org_bing_testjni_MainActivity.h
3. 工程中添加jni代码
工程右键->添加native code->输入名字->finish
多了如下文
新建一个Application.mk,配置相关选项(详细查看ndk有关Application的说明)
APP_ABI := x86
APP_PLATFORM := android-14
APP_STL := stlport_static
APP_CPPFLAGS += -fexceptions
APP_CPPFLAGS += -frtti 同时把刚刚生成的.h文件拷贝到jni目录
4. 实现native函数
函数的声明已经在头文件生成了
在CPP实现上述函数:
#include "org_bing_testjni_MainActivity.h"
#include <stdio.h>
#include <string>
using namespace std;
jstring JNICALL Java_org_bing_testjni_MainActivity_sayHello
(JNIEnv* env, jobject obj, jstring name)
{
const char* pname = env->GetStringUTFChars(name, NULL);
string str_info = "Hello World:";
str_info += pname;
jstring ret_str = env->NewStringUTF(str_info.c_str());
// C文件使用(*env)->Fun(env,xxx,...)的方式传递
// (*env)->NewStringUTF(env, "Hello World");
return ret_str;
}
JNIEXPORT jint JNICALL Java_org_bing_testjni_MainActivity_Add
(JNIEnv *env, jobject obj, jint a, jint b)
{
return a + b;
}
编译在libs目录生成libTestJni.so,打包APK会自动将上述函数打包到APK
5. 在Java中使用
loadLibrary
static
{
System.loadLibrary("TestJni");
} 然后直接调用即可:
Log.d("__BING__", sayHello("bing"));
Log.d("__BING__", "5 + 3=" + Add(5,3)); 运行效果: