当前位置:编程学习 > JAVA >>

JNI入门完整详细示例

mainActivity如下:
 
[java]  
package c.c;  
import android.os.Bundle;  
import android.view.View;  
import android.view.View.OnClickListener;  
import android.widget.Button;  
import android.widget.Toast;  
import android.app.Activity;  
/** 
 * JNI的HelloWorld示例 
 * 1 下载和安装cygwin.重要参考资料: 
 *   http://www.cnblogs.com/playing/archive/2011/07/14/2106727.html 
 *   注意make组件的安装,该步骤没有截图,但和binutils,gcc,gcc-mingw,gdb 
 *   是很类似的 
 * 2 检查cygwin是否安装正确 
 *   通过命令行进入cygwin 输入cd $NDKROOT,若输出bash_profile中于ndk 
 *   配置相关的一行信息则表示安装成功. 
 *   注意这里的输入的命令是cd $NDKROOT,所以bash_profile文件中配置的 
 *   名称也应是NDKROOT.即两者保持一致 
 * 3 编译 
 *   3.1 进入cygwin,然后cd,然后空格,然后拖入android工程的完成路径. 
 *   例如:$ cd /cygdrive/d/workplace/JNITest 
 *   3.2 再执行命令$ $NDKROOT/ndk-build -B 
 *   即可生成.so文件 
 *    
 * 编写与JNI有关的HelloWorld的小例子,参考资料: 
 * http://blog.csdn.net/zhangjie201412/article/details/7297899 
 * 注意的问题: 
 * 1 JNI函数的名称格式 
 * Java_完整的Activity路径_方法名 
 * 比如此处: 
 * jstring Java_c_c_MainActivity_getString(JNIEnv *env,jobject jobj) 
 * 该问题在上面的网址中也有提及,要尤其注意 
 * 2 利用 System.loadLibrary()载入原生库时 
 *  参数为.c文件的名称,比如: 
 *  System.loadLibrary("HelloWorld")   
 */  
public class MainActivity extends Activity {  
   private Button mButton;  
    @Override  
    public void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.main);  
        init();  
    }  
   private void init(){  
       mButton=(Button) findViewById(R.id.button);  
       mButton.setOnClickListener(new OnClickListener() {  
        public void onClick(View v) {  
            String result=getString();  
            Toast.makeText(MainActivity.this, result, Toast.LENGTH_LONG).show();  
        }  
    });  
   }  
   //声明JNI函数函数     
   public native String getString();    
   //载入原生库     
    static {    
          System.loadLibrary("HelloWorld");    
      }    
     
}  
HelloWorld.c如下:
 
[cpp]  
//HelloWorld.c  
#include <string.h>  
#include <jni.h>  
  
jstring Java_c_c_MainActivity_getString(JNIEnv *env,jobject jobj)  
{  
    return (*env)->NewStringUTF(env,"HelloWorld,JNI is good");  
}  
Android.mk如下:
 
[java] 
LOCAL_PATH := $(call my-dir)  
  
include $(CLEAR_VARS)  
  
LOCAL_MODULE    := HelloWorld  
LOCAL_SRC_FILES := HelloWorld.c  
LOCAL_LDLIBS +=  -llog -ldl  
  
include $(BUILD_SHARED_LIBRARY)  
Application.mk.mk如下:
 
[java]  
APP_STL := gnustl_static  
APP_CPPFLAGS := -frtti -fexceptions  
APP_ABI := armeabi-v7a  
 
main.xml如下:
 
[html]  
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    xmlns:tools="http://schemas.android.com/tools"  
    android:layout_width="match_parent"  
    android:layout_height="match_parent" >  
  
    <Button  
        android:id="@+id/button"  
        android:layout_width="wrap_content"  
        android:layout_height="wrap_content"  
        android:layout_centerHorizontal="true"  
        android:layout_centerVertical="true"  
        android:text="hello JNI"  
         />  
  
</RelativeLayout>  
 
 
 
 
 
补充:软件开发 , Java ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,