当前位置: 代码迷 >> Android >> Android JNI胪陈(二)
  详细解决方案

Android JNI胪陈(二)

热度:63   发布时间:2016-05-01 15:44:34.0
Android JNI详述(二)

Android JNI编程实践
  
  一、直接使用java本身jni接口(windows/ubuntu
  
  1.Eclipsh中新建一个android应用程序。两个类:一个继承于ActivityUI显示用。另一个包含native方法。编译生成所有类。
  
  jnitest.java文件:
  
  package com.hello.jnitest;
  
  
  
  import android.app.Activity;
  
  import android.os.Bundle;
  
  
  
  public class jnitest extends Activity {
  
   /** Called when the activity is first created. */
  
   @Override
  
   public void onCreate(Bundle savedInstanceState) {
  
   super.onCreate(savedInstanceState);
  
  
  
   setContentView(R.layout.main);
  
  
  
   Nadd cal = new Nadd();
  
  
  
   setTitle("The Native Add Result is " +String.valueOf(cal.nadd(10, 19)));
  
   }
  
  }
  
  Nadd.java文件:
  
  package com.hello.jnitest;
  
  
  
  public class Nadd {
  
  
  
   static {
  
   System.loadLibrary("Nadd");
  
   }
  
  
  
   public native int nadd(int a, int b);
  
  
  
  }
  
  以上在windows中完成。
  
  2.使用javah命令生成C/C++.h文件。注意类要包含包名,路径文件夹下要包含所有包中的类,否则会报找不到类的错误。classpath参数指定到包名前一级文件夹,文件夹层次结构要符合java类的组织层次结构。
  
  javah -classpath ../jnitest/bincom.hello.jnitest.Nadd
  
  com_hello_jnitest_Nadd .h文件:
  
  /* DO NOT EDIT THIS FILE - it is machine generated */
  
  #include
  
  /* Header for class com_hello_jnitest_Nadd */
  
  
  
  #ifndef _Included_com_hello_jnitest_Nadd
  
  #define _Included_com_hello_jnitest_Nadd
  
  #ifdef __cplusplus
  
  extern "C" {
  
  #endif
  
  /*
  
   * Class: com_hello_jnitest_Nadd
  
   * Method: nadd
  
   * Signature: (II)I
  
   */
  
  JNIEXPORT jint JNICALLJava_com_hello_jnitest_Nadd_nadd
  
   (JNIEnv *, jobject, jint, jint);
  
  
  
  #ifdef __cplusplus
  
  }
  
  #endif
  
  #endif
  
  3.编辑.c文件实现native方法。
  
  com_hello_jnitest_Nadd.c文件:
  
  #include
  
  #include "com_hello_jnitest_Nadd.h"
  
  JNIEXPORT jint JNICALLJava_com_hello_jnitest_Nadd_nadd(JNIEnv * env, jobject c, jint a, jint b)
  
  {
  
   return (a+b);
  
  }
  
  4.编译.c文件生存动态库。
  
  arm-none-linux-gnueabi-gcc -I/home/a/work/android/jdk1.6.0_17/include-I/home/a/work/android/jdk1.6.0_17/include/linux -fpic -ccom_hello_jnitest_Nadd.c
  
  arm-none-linux-gnueabi-ld-T/home/a/CodeSourcery/Sourcery_G++_Lite/arm-none-linux-gnueabi/lib/ldscripts/armelf_linux_eabi.xsc-share -o libNadd.so com_hello_jnitest_Nadd.o
  
  得到libNadd.so文件。
  
  以上在ubuntu中完成。
  
  5.将相应的动态库文件pushavdsystem/lib:adbpush libNadd.so /system/lib。若提示Read-only file system错误,运行adb remount命令,即可。
  
  Adb push libNadd.so /system/lib
  
  6.eclipsh中运行原应用程序即可。
  
  以上在windows中完成。
  
  对于一中生成的so文件也可采用二中的方法编译进apk包中。只需在工程文件夹中建libs\armeabi文件夹(其他文件夹名无效,只建立libs文件夹也无效),然后将so文件拷入,编译工程即可。

?

.使用NDK生成本地方法(ubuntu and windows
  
  1.安装NDK:解压,然后进入NDK解压后的目录,运行build/host-setup.sh(需要Make 3.81awk)。若有错,修改host-setup.sh文件:将#!/bin/sh修改为#!/bin/bash,再次运行即可。
  
  2.apps文件夹下建立自己的工程文件夹,然后在该文件夹下建一文件Application.mk和项project文件夹。
  
  Application.mk文件:
  
  APP_PROJECT_PATH := $(call my-dir)/project
  
  APP_MODULES := myjni
  
  3.project文件夹下建一jni文件夹,然后新建Android.mkmyjni.c。这里不需要用javah生成相应的.h文件,但函数名要包含相应的完整的包、类名。
  
  4.编辑相应文件内容。
  
  Android.mk文件:
  
  # Copyright (C) 2009 The Android Open Source Project
  
  #
  
  # Licensed under the Apache License, Version 2.0 (the"License");
  
  # you may not use this file except in compliance withthe License.
  
  # You may obtain a copy of the License at
  
  #
  
  # http://www.apache.org/licenses/LICENSE-2.0
  
  #
  
  # Unless required by applicable law or agreed to inwriting, software
  
  # distributed under the License is distributed on an"AS IS" BASIS,
  
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,either express or implied.
  
  # See the License for the specific language governingpermissions and
  
  # limitations under the License.
  
  #
  
  LOCAL_PATH := $(call my-dir)
  
  
  
  include $(CLEAR_VARS)
  
  
  
  LOCAL_MODULE := myjni
  
  LOCAL_SRC_FILES := myjni.c
  
  
  
  include $(BUILD_SHARED_LIBRARY)
  
  
  
  myjni.c文件:
  
  #include
  
  #include
  
  
  
  jstring
  
  Java_com_hello_NdkTest_NdkTest_stringFromJNI( JNIEnv*env,
  
   jobject thiz )
  
  {
  
   return (*env)->NewStringUTF(env, "Hello fromMy-JNI !");
  
  }
  
  myjni文件组织:
  
  [email protected]:~/work/android/ndk-1.6_r1/apps$ tree myjni
  
  myjni
  
  |-- Application.mk
  
  `-- project
  
   |-- jni
  
   | |-- Android.mk
  
   | `-- myjni.c
  
   `-- libs
  
   `-- armeabi
  
   `-- libmyjni.so
  
  
  
  4 directories, 4 files
  
  5.编译:make APP=myjni.
  
  以上内容在ubuntu完成。以下内容在windows中完成。当然也可以在ubuntu中完成。
  
  6.eclipsh中创建android application。将myjni中自动生成的libs文件夹拷贝到当前工程文件夹中,编译运行即可。
  
  NdkTest.java文件:
  
  package com.hello.NdkTest;
  
  
  
  import android.app.Activity;
  
  import android.os.Bundle;
  
  import android.widget.TextView;
  
  
  
  public class NdkTest extends Activity {
  
   /** Called when the activity is first created. */
  
   @Override
  
   public void onCreate(Bundle savedInstanceState) {
  
   super.onCreate(savedInstanceState);
  
   TextView tv = new TextView(this);
  
   tv.setText( stringFromJNI() );
  
   setContentView(tv);
  
   }
  
  
  
   public native String stringFromJNI();
  
  
  
   static {
  
  
  
   System.loadLibrary("myjni");
  
   }
  
  }
  
  对于二中生成的so文件也可采用一中的方法pushavd中运行。

?

?

  相关解决方案