利用JNI技术在Android中调用C++代码

               

JNI是Java Native Interface的简称,也就是Java本地接口,它提供了若干的API实现Java和其它语言的通信(主要是C&C++)。

1、打开Eclipse,File-->New-->Project…-->AndroidApplication Project-->Application Name:TestJNI,PackageName:com.testjni.android, Minimum Required SDK:API 10, Android 2.3.3(Gingerbread),Next-->不勾选 Createcustom launcher icon, 勾选Create activity,Next-->选中 BlankActivity,Next-->Activity Name:TestJNIProjectActivity, -->Finish,运行AndroidApplication显示正确;

2、选中src-->com.testjni.android,打开TestJNIProjectActivity.java文件内代码改为:

package com.testjni.android;import android.os.Bundle;import android.app.Activity;import android.view.Menu;import android.widget.TextView;public class TestJNIProjectActivity extends Activity @Override protected void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);      TextView tv = new TextView(this);        tv.setText(StringFromJni());        setContentView(tv);   } public native String StringFromJni()static{  System.loadLibrary("hello-jni"); } }

3、编译该工程,会在bin\classes\com\testjni\android文件夹下生成TestJNIProjectActivity.class文件;

4、打开命令行窗口,将其定位到\bin\classes目录下,输入命令:javah –classpath   D:\ProgramFiles\Android\android-sdk\platforms\android-10\android.jar;com.testjni.android.TestJNIProjectActivity,会在classes文件夹下生成com_testjni_android_TestJNIProjectActivity.h(说明:*.jar也可以是其它版本);

5、选中TestJNI工程,点击右键-->New-->Folder新建一个jni文件夹,选中jni, -->New-->File,新建2个文件,名称分别为hello-jni.c,Android.mk;

6、编写hello-jni.c文件,代码为:

#include <string.h>#include <jni.h>JNIEXPORT jstring JNICALL Java_com_testjni_android_TestJNIProjectActivity_StringFromJni  (JNIEnv * env, jobject thiz){     return (*env)->NewStringUTF(env, "Hello from JNI !");}

7、 创建Android.mk文件,其内容为:

LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE    := hello-jniLOCAL_SRC_FILES := hello-jni.cinclude $(BUILD_SHARED_LIBRARY)

8、利用NDK生成.so文件:选中工程,点击右键-->Properties-->Builders-->New,新建立一个Builder,在弹出的对话框上点中Program,点击OK;在弹出对话框EditConfiguration中,配置选项卡Main:Location中填入NDK安装目录,D:\ProgramFiles\Android\android-sdk\android-ndk-r9\ndk-build.cmd;WorkingDirectory中填入工程的根目录,E:\Test\Android\HelloJni,点击Apply;配置选项卡Refresh,勾选Refreshresources upon completion, The entire workspace, Recursively includesub-folders,点击Apply;配置Build Options选项卡,勾选Allocate Console(necessary for input), After a “Clean”, Duringmanual builds, During auto builds, Specify working set of relevant resources,点击SpecifyResources..,勾选TestJNI工程的jni目录,点击Finish,点击Apply,点击OK,会在\libs\armeabi目录下生成相应的libhello-jni.so库;

9、运行该工程,一切显示正确。

以上是.c文件的操作步骤,若将.c文件该为.cpp文件,则需改动两个文件:

1、Android.mk:

LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE    := hello-jniLOCAL_SRC_FILES := hello-jni.cppinclude $(BUILD_SHARED_LIBRARY)

2、hello-jni.cpp:

#include <string.h>#include <jni.h>#ifdef __cplusplusextern "C" {#endifJNIEXPORT jstring JNICALL Java_com_example_testjni_TestJNIProjectActivity_StringFromJni  (JNIEnv * env, jobject thiz){     return env->NewStringUTF("Hello from JNI !");}#ifdef __cplusplus}#endif


参考文献:

1、  http://blog.csdn.net/haha_mingg/article/details/6332115

2、  http://blog.csdn.net/cghs123/article/details/7044826

3、   http://blog.csdn.net/laczff21/article/details/7542236

4、 android-ndk-r9-windows-x86_64中例子代码




           

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
AndroidJNI(Java Native Interface)是一种允许Java代码与本地代码(通常是C/C++代码)进行交互的机制。通过JNI,开发者可以在Java代码调用本地代码,实现对底层系统或其他原生库的访问和操作。 下面是简要的JNI调用过程: 1. 编写本地代码:首先,需要编写包含所需功能的本地代码,通常是用C或C++编写。这些本地代码将被编译成共享库(.so文件)。 2. 创建JNI接口:在Java代码,需要声明与本地代码对应的JNI接口。这些接口方法将与本地代码的函数进行绑定,以便在Java调用。 3. 生成头文件:使用Java Development Kit(JDK)的工具javah,生成包含JNI接口方法定义的头文件。 4. 实现JNI接口:在本地代码,需要实现JNI接口声明的方法。这些方法将提供与Java代码之间的桥梁,使得Java可以调用本地代码。 5. 编译本地代码:使用C/C++编译器将本地代码编译成共享库(.so文件)。 6. 将共享库加载到应用程序:在Android应用程序,可以使用System.loadLibrary()方法加载共享库。 7. 调用JNI方法:在Java代码,通过调用JNI接口声明的方法来调用本地代码。可以使用native关键字标记这些方法。 8. 运行应用程序:在应用程序运行时,当Java代码调用JNI方法时,将触发与本地代码的交互,完成相应的功能操作。 需要注意的是,JNI调用涉及到本地代码的编写和编译,因此需要对C/C++有一定的了解。此外,在JNI调用过程,需要注意内存管理和数据类型转换等问题,以确保安全性和正确性。 总结起来,JNI调用过程包括编写本地代码、创建JNI接口、生成头文件、实现JNI接口、编译本地代码、加载共享库、调用JNI方法等步骤,通过这些步骤可以实现Java代码与本地代码之间的交互。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值