Android源码编译JNI
来源:互联网 发布:河北高速网络查询 编辑:程序博客网 时间:2024/06/10 17:25
在android开发中,有时候需要编写一些C/C++代码,这时候就要用到JNI技术,我们需要将C/C++程序首先编译成so库,在java中通过native方法调用so库中的函数。
实现以上目的有三种方式:
1、单独编译so库文件,将它push到手机的system/lib目录下, 在java程序中通过loadLibrary加载so库。
2、使用NDK工具进行编译,需要配置NDK环境,然后通过Android Studio将其打包打APK中。
3、在Android源码环境中使用mm,so文件就能够打包到APK文件中,随着APK一起发布,而不是将so文件放到系统目录中。
如果是开发系统级的APK,就需要选择第三种方法,下面是第三种方法的具体实例。
APP编译
Android.mk
LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE_TAGS := testsLOCAL_MULTILIB := 32LOCAL_PROGUARD_ENABLED := disabledLOCAL_SDK_VERSION := currentLOCAL_SRC_FILES := \ $(call all-java-files-under, src) \ $(call all-renderscript-files-under, src)LOCAL_PACKAGE_NAME := MyJniLOCAL_JNI_SHARED_LIBRARIES := libmy_jniinclude $(BUILD_PACKAGE)include $(call all-makefiles-under,$(LOCAL_PATH))
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.app" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="18" android:targetSdkVersion="19"/> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".MainActivity" 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>
JNI编译
jni/Android.mk
LOCAL_PATH:= $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE := libmy_jni#需要特别注意,缺失会导致library “libc++.so” not foundLOCAL_SDK_VERSION := 14LOCAL_MODULE_TAGS := optionalLOCAL_SRC_FILES := Addjni.cLOCAL_CFLAGS += -Wall -Wextra -Werror -Wno-unused-parameterDISABLE_DEXPREOPT:=trueLOCAL_NDK_STL_VARIANT := stlport_staticinclude $(BUILD_SHARED_LIBRARY)
jni/Application.mk
APP_STL := stlport_static
MainActivity.java
package com.example.app;import android.os.Bundle;import android.view.View;import android.widget.Button;import android.widget.EditText;import android.widget.TextView;import android.app.Activity;public class MainActivity extends Activity { private TextView mSum; private EditText mEditText1; private EditText mEditText2; private Button mButton; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mSum = (TextView) findViewById(R.id.sum); mEditText1 = (EditText) findViewById(R.id.number1); mEditText2 = (EditText) findViewById(R.id.number2); mButton = (Button)findViewById(R.id.button_result); mButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String mNum1 = mEditText1.getText().toString(); String mNum2 = mEditText2.getText().toString(); if(mNum1.equals("") || mNum2.equals("")) return; android.util.Log.i("wwd","mNum1 = "+mNum1+", mNum2 = "+mNum2); int add1 = Integer.parseInt(mNum1); int add2 = Integer.parseInt(mNum2); int summary = add(add1, add2); mSum.setText("sum = " + summary); } }); } //调用SO库中的函数 public native int add(int num1, int num2); //这里加载SO库。 static{ System.loadLibrary("my_jni"); }}
jni/Addjni.c
#include <stdio.h>#include <jni.h>#include "Addjni.h"//这里就是我们调用C/C++中的功能模块,实际开发中可以调用其他的各种C类去实现功能int addNumber(int num1, int num2){ return num1 + num2;}//MainActivity中调用的add函数,作用就是连接java层和C/C++层的API,格式是java+包名+类名+函数名jint Java_com_example_app_MainActivity_add(JNIEnv* env, jobject thiz, jint num1, jint num2){ return addNumber(num1, num2);}
jni/Addjni.h
#ifndef ADDJNI_H#define ADDJNI_Hextern int add(int num1, int num2);#endif
我们只需要在apk根目录执行mm编译Android.mk,jni/Android.mk就会执行,而且生成的so文件会自动打包到apk文件中。
阅读全文
0 0
- Android源码编译JNI
- android 源码下的JNI编译
- Android jni实例(android源码树编译so库)
- 利用源码编译Android系统JNI动态库
- 深入了解android平台的jni---编译ffmpeg源码
- Android源码编译并预装带JNI的apk
- Android源码编译JNI遇到的问题与解决方法
- Android源码环境下编译自带JNI的APP
- Android 源码编译错误:Could not load 'clearsilver-jni'
- Android JNI 编译注意事项
- android JNI编译注意事项
- jni编译android项目
- Android jni编译方法
- Android JNI编译问题汇总
- android jni部分手动编译
- android ndk jni 项目编译
- Android JNI 编译C++代码
- Android-Ndk Cmake编译JNI
- Git使用笔记
- VS2017+opencv3.0.0+opencv_contrib3.0.0
- ES6的相关知识
- 论csdn博客抄袭与“转载”
- struts2的核心和工作原理
- Android源码编译JNI
- log4net 使用笔记(asp.netcore)
- 金蝶万能票据通旗靓版V6.0
- LightOJ 1004 Monkey Banana Problem
- Chapter 13. Convolutional Neural Networks
- python读取csv文件
- Vue项目build出的网页显示错误,css中图片引用位置错误解决办法
- 遥感基础
- C++ vector的拷贝