Android电视下的JNI demo
来源:互联网 发布:金融数据库软件 编辑:程序博客网 时间:2024/05/18 11:50
参考文章:
https://my.oschina.net/innost/blog/486594
http://www.cnblogs.com/larrylawrence/p/3898782.html
这几天学习下Android JNI demo,编译ok,记录下便于查询。
1、TV项目android code或是android 源码/linux系统(Ubuntu12.0.4)
2、动态注册JNI 函数(JNI_OnLoad)
3、package name:myjni,两个java文件,一个c文件,两个Android.mk文件,一个AndroidManifest.xml文件
4、编译位置:android\lollipop\device\xxxx\xxxx\app\,这个路径是本地路径,其他人的可能不一样,位于device路径下面,JNI的例子也可以参照development/samples/SimpleJNI,或是放到samples下面进行编译。
5、linux下编译过程中的error:jni下面如果是c++文件就用env->,若用的c文件,则用(*env)->,而且引用的函数里要多加一个参数env,不然会报错,vm指针的话类似。比如: error: too few arguments to function ‘(*env)->FindClass,在下文8中clazz = (*env)->FindClass(env,className)。
6、编译命令:
android\lollipop下面:
source build/envsetup.sh;
有些可能需要在lunch + ANDROIDLUNCHNAME;
mm -B;
7、生成的文件:
Install: out/target/product/xxxx/system/lib/libjnitext.soInstall: out/target/product/xxxx/system/app/MyJNI/MyJNI.apk
8、编译文件内容:
app/MyJNI/下面的Android.mk内容:
TOP_LOCAL_PATH:= $(call my-dir)# Build activityLOCAL_PATH:= $(TOP_LOCAL_PATH)include $(CLEAR_VARS)LOCAL_MODULE_TAGS := optional# Only compile source java files in this apk.LOCAL_SRC_FILES := $(call all-subdir-java-files)LOCAL_PACKAGE_NAME := MyJNILOCAL_JNI_SHARED_LIBRARIES := libjnitextLOCAL_PROGUARD_ENABLED := disabledLOCAL_SDK_VERSION := currentinclude $(BUILD_PACKAGE)# Use the following include to make our test apk.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.xxxx.myjni"> <application android:label="Main Activity"> <activity android:name="MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application></manifest>
jni文件夹下面:JNITest.c和Android.mk
JNITest.c内容:
xxxx是指package name
#define LOG_TAG "myjni JNITest.c"#include <utils/Log.h>#include <stdio.h>#include <string.h>/* DO NOT EDIT THIS FILE - it is machine generated */#include "jni.h"/*#include <com_example_xxxx_myjni_JNITest.h>*//* Header for class com_example_xxxx_myjni_JNITest *//* * Class: com_example_xxxx_myjni_JNITest * Method: getCLangString * Signature: ()Ljava/lang/String; */static jstring getCLangString(JNIEnv *env, jobject objt) { return (*env)->NewStringUTF(env,"This is JNItest!"); }/*JNIEXPORT jint JNICALL Java_com_example_xxxx_myjni_JNITest_addint (JNIEnv *env, jobject objt, jint a, jint b){ int c=a+b; return c;}*/static const char *classPathName = "com/example/xxxx/myjni/JNITest"; static JNINativeMethod methods[] = { {"getCLangString", "()Ljava/lang/String", (void*)getCLangString },};/* * Register several native methods for one class. */static int registerNativeMethods(JNIEnv* env, const char* className, JNINativeMethod* gMethods, int numMethods){ jclass clazz; clazz = (*env)->FindClass(env,className); if (clazz == NULL) { ALOGE("Native registration unable to find class '%s'", className); return JNI_FALSE; } if ((*env)->RegisterNatives(env,clazz, gMethods, numMethods) < 0) { ALOGE("RegisterNatives failed for '%s'", className); return JNI_FALSE; } return JNI_TRUE;}/* * Register native methods for all classes we know about. * * returns JNI_TRUE on success. */static int registerNatives(JNIEnv* env){ if (!registerNativeMethods(env, classPathName, methods, sizeof(methods) / sizeof(methods[0]))) { return JNI_FALSE; } return JNI_TRUE;}/* * This is called by the VM when the shared library is first loaded. */ typedef union { JNIEnv* env; void* venv;} UnionJNIEnvToVoid;jint JNI_OnLoad(JavaVM* vm, void* reserved){ UnionJNIEnvToVoid uenv; uenv.venv = NULL; jint result = -1; JNIEnv* env = NULL; ALOGI("JNI_OnLoad"); if ((*vm)->GetEnv(vm,&uenv.venv, JNI_VERSION_1_4) != JNI_OK) { ALOGE("ERROR: GetEnv failed"); goto bail; } env = uenv.env; if (registerNatives(env) != JNI_TRUE) { ALOGE("ERROR: registerNatives failed"); goto bail; } result = JNI_VERSION_1_4; bail: return result;}
jni/Android.mk的内容
LOCAL_PATH:= $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE_TAGS := optionalLOCAL_MODULE := libjnitext#LOCAL_PACKAGE_NAME := MyJNI# Also need the JNI headers.LOCAL_C_INCLUDES += \$(JNI_H_INCLUDE)LOCAL_SRC_FILES := JNITest.c# All of the shared libraries we link against.LOCAL_SHARED_LIBRARIES := \libutils libloginclude $(BUILD_SHARED_LIBRARY)
myjni下面的两个java文件
xxxx是指package name
JNITest.java内容:
package com.example.xxxx.myjni;public class JNITest { static { System.loadLibrary("jnitext"); //defaultConfig.ndk.moduleName } public native String getCLangString();}
MainActivity.java内容
package com.example.xxxx.myjni;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.widget.TextView;import android.widget.Toast;public class MainActivity extends Activity { private TextView textView,textView2; //private Button button1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //setContentView(R.layout.activity_main); TextView tv = new TextView(this); //textView = (TextView)findViewById(R.id.jnitest1); JNITest jniTest=new JNITest(); tv.setText(jniTest.getCLangString()); setContentView(tv); }}
- Android电视下的JNI demo
- ubuntu下的android JNI入门DEMO
- Linux下JNI的demo
- linux/ubuntu下使用jni的demo
- Android JNI demo编译遇到的错误
- android JNI demo
- Android JNI Demo
- android NDK/JNI demo
- JNI的开发Demo
- jni 的一个demo
- Android JNI实现计算器demo
- Android Studio 2.2 JNI Demo
- Android调用Jni,非常简单的一个Demo
- android 包含了JNI,,fresco,RecyclerView的DEMO
- android JNI 简单demo(2)之JNI demo 编写
- windows下Java JNI测试Demo
- Android下的JNI简单实例HelloWorld
- 【笔记】Android平台下的JNI开发
- 如何修改windows10的用户文件夹名
- 等差素数列
- ECS配置Docker-swarm
- system
- 人脸识别简史与近期进展
- Android电视下的JNI demo
- 第二天学习记录
- unity导出ios工程导入到另一个工程中
- ubuntu gcc编译时对’xxxx’未定义的引用问题
- 洛谷1781宇宙总统
- Hololens官方教程精简版 - 07. Spatial mapping(空间映射)
- Tesseract-OCR引擎安装
- Linux 中文乱码问题
- MultiDex与热修复实现原理(二)MultiDex基本原理及解析