码迷,mamicode.com
首页 > 编程语言 > 详细

ndk学习17: jni之Java调用C&C++

时间:2016-08-09 22:18:51      阅读:289      评论:0      收藏:0      [点我收藏+]

标签:


一.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
(JNIEnvenvjobject objjstring name)
{
    const charpname = env->GetStringUTFChars(nameNULL);
    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 *envjobject objjint ajint 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));  

运行效果:
技术分享



























ndk学习17: jni之Java调用C&C++

标签:

原文地址:http://www.cnblogs.com/bingghost/p/5754685.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!