《Android系统学习》之JAVA与C混合编程——JNI

====================================================================================================================================

一、APK编写

1.Android.mk

LOCAL_PATH:= $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE_TAGS := optional

LOCAL_SRC_FILES := $(call all-subdir-java-files)

LOCAL_PACKAGE_NAME := Hello

include $(BUILD_PACKAGE)
2.AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.hello.jnitest"
      android:versionCode="1"
      android:versionName="1.0">
    <application
            android:icon="@drawable/icon"
            android:label="Bug Report Sender" >
        <activity android:name=".Hello"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
      </application>
    </manifest> 
3.src/com/hello/jnitest/Hello.java

package com.hello.jnitest;

import com.hello.jnitest.R;

//jni
import com.tank.common.Inputproc;
//end

import android.app.Activity;
import android.os.Bundle;

import android.os.RemoteException;  
import android.util.Log;  
import android.view.View;  
import android.view.View.OnClickListener;  
import android.widget.Button;  
import android.widget.EditText; 
 

public class Hello extends Activity implements OnClickListener {
  private final static String LOG_TAG = "com.hello.jnitest";  

  private EditText valueText = null;  
  private Button relButton = null;  
  private Button clearrelButton = null;  
  private Button focusButton = null;
  private Button clearfocusButton = null;
  private Button writeprocButton = null;
  private Button cleartestButton = null;
  //jni
  private Inputproc test = null;
  //end

  @Override

  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    valueText = (EditText)findViewById(R.id.edit_value);  
    relButton = (Button)findViewById(R.id.button_rel);  
    clearrelButton = (Button)findViewById(R.id.button_clearrel);  
    focusButton = (Button)findViewById(R.id.button_focus);  
    clearfocusButton = (Button)findViewById(R.id.button_clearfocus);
    writeprocButton = (Button)findViewById(R.id.button_writeproc);
    cleartestButton = (Button)findViewById(R.id.button_cleartest);
  
    relButton.setOnClickListener(this);  
    clearrelButton.setOnClickListener(this);  
    focusButton.setOnClickListener(this);
    clearfocusButton.setOnClickListener(this);
    writeprocButton.setOnClickListener(this);
    cleartestButton.setOnClickListener(this);
    //jni
    test = new Inputproc();
    //end
  } 

  @Override  
  public void onClick(View v) {  
    if(v.equals(relButton)) {   
      //jni
      setTitle("The Native Add Result is "+String.valueOf(test.changesinglemod(0))); 
      //end         
    }  
    else if(v.equals(clearrelButton)) { 
      //jni  
      setTitle("The Native Add Result is "+String.valueOf(test.changesinglemod(1)));  
      //end
    } 
    else if(v.equals(focusButton)) { 
      //jni  
      setTitle("The Native Add Result is "+String.valueOf(test.changesinglemod(2)));  
      //end
    } 
    else if(v.equals(clearfocusButton)) { 
      //jni  
      setTitle("The Native Add Result is "+String.valueOf(test.changesinglemod(3)));  
      //end
    } 
    else if(v.equals(writeprocButton)) { 
      //jni  
      //String text = valueText.getText().toString();  
      String text = "0;0;102;1";
      setTitle("The Native Add Result is "+String.valueOf(test.input_event_in(text)));  
      String text1 = "0;0;102;0";
      setTitle("The Native Add Result is "+String.valueOf(test.input_event_in(text1)));
      //end
    } 
    else if(v.equals(cleartestButton)) {   
      String text = "";  
      valueText.setText(text); 
    }        
  }  
}
4.src/com/tank/common/Inputproc.java

package com.tank.common;
public class Inputproc {
  static {
    System.loadLibrary("inputproc_jni");
  }
  public native int changesinglemod(int a);
  public native int input_event_in(String a);
}

5.res/layout/main.xml

<?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
       android:orientation="vertical"
       android:layout_width="fill_parent"
       android:layout_height="fill_parent">
       <LinearLayout
          android:layout_width="fill_parent"
          android:layout_height="wrap_content"
          android:orientation="vertical" 
          android:gravity="center">
          <TextView 
             android:layout_width="wrap_content"
             android:layout_height="wrap_content" 
             android:text="@string/value">
          </TextView>
          <EditText 
             android:layout_width="fill_parent"
             android:layout_height="wrap_content" 
             android:id="@+id/edit_value"
             android:hint="@string/hint">
          </EditText>
       </LinearLayout>
       <LinearLayout
          android:layout_width="fill_parent"
          android:layout_height="wrap_content"
          android:orientation="horizontal" 
          android:gravity="center">
          <Button 
             android:id="@+id/button_rel"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:text="@string/rel">
          </Button>
          <Button 
             android:id="@+id/button_clearrel"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:text="@string/clearrel">
          </Button>
          <Button 
             android:id="@+id/button_focus"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:text="@string/focus">
          </Button>
          <Button 
             android:id="@+id/button_clearfocus"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:text="@string/clearfocus">
          </Button>
          <Button 
             android:id="@+id/button_writeproc"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:text="@string/writeproc">
          </Button>
          <Button 
             android:id="@+id/button_cleartest"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:text="@string/cleartest">
          </Button>
       </LinearLayout>
    </LinearLayout>

6.res/values/strings.xml

<?xml version="1.0" encoding="utf-8"?>
    <resources>
       <string name="app_name">Hello</string>
       <string name="value">Value</string>
       <string name="hint">Please input a value...</string>
       <string name="rel">relmod</string>
       <string name="clearrel">relmodclose</string>
       <string name="focus">focusmod</string>
       <string name="clearfocus">focusmodclose</string>
       <string name="writeproc">Writeproc</string>
       <string name="cleartest">Cleartest</string>
    </resources>
7.res/drawable-mdpi/和res/drawable-hdpi下放图片。
====================================================================================================================================
1.Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_PRELINK_MODULE := false

LOCAL_SRC_FILES := \
	com_tank_common_Inputproc.cpp \
	inputproc.cpp

LOCAL_SHARED_LIBRARIES := \
	libandroid_runtime \
	libutils

LOCAL_MODULE := libinputproc_jni

LOCAL_MODULE_TAGS := optional

include $(BUILD_SHARED_LIBRARY)
2.com_tank_common_Inputproc.cpp

#define LOG_TAG "changemod-JNI"
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <assert.h>
#include "jni.h"
#include "JNIHelp.h"
#include "android_runtime/AndroidRuntime.h"
#include "inputproc.h"
///    
static jint com_tank_common_Inputproc_changesinglemod(JNIEnv *env, jobject obj, jint a){
  switch(a){
    case 0:{
      changesinglemod(34); //pipe 0
      break;
    }
    case 1:{
      changesinglemod(35); //pipe 1
      break;
    }
    case 2:{
      changesinglemod(36); //pipe 2
      break;
    }
    case 3:{
      changesinglemod(37); //pipe 3
      break;
    }
  }
  return 0;
} 
static jint com_tank_common_Inputproc_input_event_in(JNIEnv *env, jobject obj, jstring a){
  char buf[128];
  const char* str = env->GetStringUTFChars(a,NULL);
  LOGD("str is %s\n",str);
  strcpy(buf,str);
  LOGD("buf is %s",buf);
  input_event_in(buf);
  env->ReleaseStringUTFChars(a,str);
  return 0;
}
///
static JNINativeMethod gMethods[] = {
  {"changesinglemod", "(I)I", (void *)com_tank_common_Inputproc_changesinglemod},
  {"input_event_in", "(Ljava/lang/String;)I", (void *)com_tank_common_Inputproc_input_event_in},
};

static int register_Inputproc(JNIEnv *env){
  return android::AndroidRuntime::registerNativeMethods(env, "com/tank/common/Inputproc", gMethods, NELEM(gMethods));
}

jint JNI_OnLoad(JavaVM *vm, void *reserved){
  JNIEnv *env = NULL;
  if (vm->GetEnv((void **)&env, JNI_VERSION_1_4) != JNI_OK) {
    printf("Error GetEnv\n");
    return -1;
  }
  assert(env != NULL);
  if (register_Inputproc(env) < 0) {
    printf("register_android_test_hello error.\n");
    return -1;
  }
  return JNI_VERSION_1_4;
}

3.具体实现inputproc.cpp和inputproc.h实现上述两个函数即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值