打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
android JIN使用流程

经过几天的努力终于搞定了android JNI部分,下面将我的这个小程序和大家分享一下。android JNI是连接android Java部分和C/C++部分的纽带,完整使用JNI需要Java代码和C/C++代码。其中C/C++代码用于生成库文件,Java代码用于引用C /C++库文件以及调用C/C++方法。

android Java部分代码:

01jnitest.java
02 
03package com.hello.jnitest;
04 
05  
06 
07import android.app.Activity;
08 
09import android.os.Bundle;
10 
11  
12 
13public class jnitest extends Activity {
14 
15    /** Called when the activity is first created. */
16 
17    @Override
18 
19    public void onCreate(Bundle savedInstanceState) {
20 
21        super.onCreate(savedInstanceState);
22 
23        setContentView(R.layout.main);
24 
25        Nadd test = new Nadd();
26 
27        setTitle('The Native Add Result is '+String.valueOf(test.nadd(1020)));
28 
29    }
30 
31}
32 
33Nadd.java
34 
35package com.hello.jnitest;
36 
37  
38 
39public class Nadd {
40 
41static {
42 
43System.loadLibrary('hello_jni');
44 
45}
46 
47  
48 
49public native int nadd(int a, int b);
50 
51}

Java代码说明:
1)jnitest.java是一个activity的类对象,在该类对象中生成调用JNI函数的类对象,同时调用JNI方法,最后将JNI方法的结果显示到标题栏上;
2)Nadd.java是一个引用和声明JNI库和函数的类,其中System.loadLibrary();函数用来引用JNI库,默认JNI库放在 android系统的/system/lib/目录下;public nadd int nadd(int a, int b);为声明需要在java程序中使用的JNI库中的函数;
JNI中java部分的代码到此就结束了,总结一下在java代码中需要做两件事:
1)使用System.loadLibrary()函数来引用JNI库;
2)声明调用JNI库的函数且前面添加native关键字;

android C/C++部分代码:
01#define LOG_TAG 'hello-JNI'
02#include
03#include
04#include
05#include
06#include
07#include
08#include
09#include 'jni.h'
10#include 'JNIHelp.h'
11#include 'android_runtime/AndroidRuntime.h'
12static jint com_hello_jnitest_jnitest_nadd(JNIEnv *env, jobject obj, jint a, jint b)
13{
14return (a * b);
15}
16static JNINativeMethod gMethods[] = {
17{'nadd''(II)I', (void *)com_hello_jnitest_jnitest_nadd},
18};
19static int register_android_test_hello(JNIEnv *env)
20{
21returnandroid::AndroidRuntime::registerNativeMethods(env, 'com/hello/jnitest/Nadd', gMethods, NELEM(gMethods));
22}
23jint JNI_OnLoad(JavaVM *vm, void *reserved)
24{
25JNIEnv *env = NULL;
26if (vm->GetEnv((void **)&env, JNI_VERSION_1_4) != JNI_OK) {
27printf('Error GetEnv\n');
28return -1;
29}
30assert(env != NULL);
31if (register_android_test_hello(env) < 0)="">
32printf('register_android_test_hello error.\n');
33return -1;
34}
35return JNI_VERSION_1_4;
36}

JNI C/C++代码说明:
1)JNI_OnLoad()函数。该函数在Java程序调用System.loadLibrary()时,被调用执行,用于向JavaVM注册JNI函数等。在本例中首先通过参数JavaVM(Java虚拟机指针)获取当前应用程序所在的线程,即:JNIEnv。再通过调用 android::AndroidRuntime::registerNativeMethods()注册native实现的函数指针。
2)JNI函数和Java调用函数的映射关系。使用JNINativeMethod将java调用的函数名与JNI实现的函数名联系在一起;
3)JNI函数实现;

Android.mk代码:
1LOCAL_PATH := $(call my-dir)
2include $(CLEAR_VARS)
3LOCAL_PRELINK_MODULE := false
4LOCAL_SRC_FILES := \
5com_hello_jnitest.cpp
6LOCAL_SHARED_LIBRARIES := \
7libandroid_runtime
8LOCAL_MODULE := libhello_jni
9include $(BUILD_SHARED_LIBRARY)

需要注意的是:
1)JNI C/C++部分的代码需要在android源代码树上进行编译,编译完成后我的做法是直接将生成的.so通过adb push方法上传到android虚拟机的/system/lib/目录下;
2)java代码可以在eclipse下直接编译且在虚拟机上执行;

编译JNI C/C++部分代码(在android内核源代码根目录下):
#make libhello_jni
之后在out/target/product/generic/system/lib/目录下生成libhello_jni.so

上传libhello_jni.so到android虚拟机:
#adb push out/target/product/generic/system/lib/libhello_jni.so /system/lib
注意:此时有可能出现Out of Memory的错误提示。当出现如上错误提示时,需要使用#adb remount重新加载一下就可以了。
另外,也有可能直接使用eclipse启动android虚拟机时出现上述错误且使用#adb remount也出现的情况,此时需要手动启动android虚拟机,如:#emulator -avd xxx -partition-size 128,之后在使用#adb push就可以了。
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
JNI技术与Android应用(0)
Android JNI简单实例(android 调用C/C++代码)
Android JNI 函数注册的两种方式(静态注册/动态注册)
Android Studio开发JNI示例
ndk eclipse集成自己的经验
Android笔记之使用CMake进行JNI开发(Android Studio)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服