Tag: jni

如何获得用NDK应用程序编写的“printf”消息?

如果我在java文件中定义这样的function /** * Adds two integers, returning their sum */ public native int add( int v1, int v2 ); 所以我需要在C文件中编码 JNIEXPORT jint JNICALL Java_com_marakana_NativeLib_add (JNIEnv * env, jobject obj, jint value1, jint value2) { printf("\n this is log messge \n"); return (value1 + value2); } 那么从这个printf将打印它的消息? 在login我不明白吗? 如何通过放置日志消息来debugging任何NDK应用程序?

在Android ndk / jni中使用C ++

所有的ndk样本只使用头文件中声明为extern的基本C函数,并在cpp文件中定义。 然后在包含jnicallback的C文件中包含头文件后,一切正常。 有没有可能使用android ndk的C + +类? 我的应用程序不会是一个本地的活动,它仍然有一个重要的Java部分,但它会调用CPU密集型计算的本地C代码(已经用C ++编写,有类和其他C ++的东西)。 这里是我的你好,像现在strcuture世界: 文件“first.h” #ifndef FIRST_H #define FIRST_H class Test {}; #endif /* FIRST_H */ 文件“second.cpp” #include <jni.h> #include "first.h" #ifdef __cplusplus extern "C" { #endif jint Java_com_example_twolibs_TwoLibs_add( JNIEnv* env, jobject this, jint x, jint y ) { Test t; return 0; } #ifdef __cplusplus } #endif 最后是Android.mk […]

为什么一些Android手机导致我们的应用程序抛出java.lang.UnsatisfiedLinkError?

在市场上使用我们的应用的某些Android手机上,我们遇到了java.lang.UnsatisfiedLinkError 。 问题描述: static { System.loadLibrary("stlport_shared"); // C++ STL System.loadLibrary("lib2"); System.loadLibrary("lib3"); } 使用java.lang.UnsatisfiedLinkError将System.loadLibrary()行中的应用程序崩溃。 java.lang.UnsatisfiedLinkError: Couldn't load stlport_shared from loader dalvik.system.PathClassLoader[dexPath=/data/app/app_id-2.apk,libraryPath=/data/app-lib/app_id-2]: findLibrary returned null 解决scheme 我们开始在所有安装上运行一些自定义诊断程序,以检查每个lib是否在/data/data/app_id/lib文件夹中解压缩。 PackageManager m = context.getPackageManager(); String s = context.getPackageName(); PackageInfo p; p = m.getPackageInfo(s, 0); s = p.applicationInfo.dataDir; File appDir = new File(s); long freeSpace = appDir.getFreeSpace(); File[] appDirList = appDir.listFiles(); […]

如何用JNI创build对象?

我需要使用NDK和JNI来实现一些Android应用程序的function。 这里是C代码,我的担心,我写道: #include <jni.h> #include <stdio.h> jobject Java_com_example_ndktest_NDKTest_ImageRef(JNIEnv* env, jobject obj, jint width, jint height, jbyteArray myArray) { jint i; jobject object; jmethodID constructor; jobject cls; cls = (*env)->FindClass(env, "com/example/ndktest/NDKTest/Point"); //what should put as the second parameter? Is my try correct, according to what //you can find in .java file? I used this documentation: http://download.oracle.com/javase/6/docs/technotes/guides/jni/spec/functions.html#wp16027 […]

进行JNI调用的数量开销是多less?

仅仅根据性能,大约有多less“简单”的java行是打JNI调用的同等性能? 或者试图用更具体的方式来expression这个问题,如果一个简单的java操作如 someIntVar1 = someIntVar2 + someIntVar3; 被赋予了一个“CPU工作”指数1 ,做JNI调用的开销是什么典型的(ballpark)“CPU工作”指标? 这个问题忽略了等待本地代码执行的时间。 在电话方面,严格来讲,就是通话的“掉旗”部分,而不是“通话费率”。 问这个问题的原因是有一个“经验法则”,知道当你知道本地成本(来自直接testing)和给定操作的Java成本时,何时试图编写一个JNI调用。 它可以帮助您快速避免编写JNI调用的麻烦,只发现调用开销消耗了使用本机代码的任何好处。 编辑: 一些人正在挂起CPU,RAM等变化,这些都是几乎无关的问题 – 我要求的相对成本线的Java代码。 如果CPU和内存不足,对于Java和JNI来说都很差,所以环境因素应该平衡。 JVM版本也属于“不相关”类别。 这个问题并不是要求在毫微秒的绝对时间,而是以“简单的Java代码行”为单位的一个球场“工作努力”。

将JNItypes转换为本机types

虽然有关于将jstring转换为本地string的文档( string nativeString = env->GetStringUTFChars(jStringVariable, NULL); )我找不到将jboolean转换为bool或jint为int的示例。 任何人都可以build议如何实现?

JNI位图操作,帮助避免使用大图像时的OOM

背景 大多数情况下,在Android上获得OOM是由于使用了太多的位图和/或创build大的位图。 最近我决定尝试JNI,以便通过将数据本身存储在JNI端来避免OOM。 经过一段时间的搞乱JNI后,我已经创build了一些post寻求帮助和分享我的知识,我现在决定与你分享一些更多的代码。 这里是任何人有兴趣阅读发现或贡献的post: 如何将位图caching到本机内存 在android上使用JNI进行图像解码和操作 JNI – 如何使用不同字段的多个Jni包装实例? 使用JNI和NDK旋转位图 这一次,我添加了存储,恢复,裁剪和旋转位图的function。 应该很容易添加更多的选项, 如果其他人在这里将他们自己的代码添加到更有用的function , 我会很高兴 。 所以我要展示的代码实际上是我创build的所有东西的合并。 使用示例代码: Bitmap bitmap=BitmapFactory.decodeResource(getResources(),R.drawable.ic_launcher); final int width=bitmap.getWidth(),height=bitmap.getHeight(); // store the bitmap in the JNI "world" final JniBitmapHolder bitmapHolder=new JniBitmapHolder(bitmap); // no need for the bitmap on the java "world", since the operations are done on the JNI "world" […]

Unity3D与android的集成

我需要创build一个由Unity3d(animation等)和AndroidSDK(通过androidSDK我写的几个活动,在Java,清单和资源编写的活动)写的部分组成的android应用程序, 事实上,我已经有了这些部分(至less嘲笑准备=))我不知道如何沟通他们之间。 我读了很多关于unity3d android集成的文章(主要是关于所谓的“插件”),并没有理解这个工作人员是如何工作的=(我理解的主要事情(每个人都写了官方文档)是关于插件的文档非常差… =) 我可以理解的唯一沟通方式是从unity3d脚本(使用AndroidJavaClass和AndroidJavaObject)进行意图(广播),以便我的活动(用java编写)可以处理它。 但有些事情告诉我,这不是最好的解决scheme… 我读到的关于这个问题的是我需要使用JNI(这是java本地接口 – 为什么?!? – 为什么我需要使用本机代码?) 我是否需要在java上创build一些中间层代码,目的是与我的java活动进行通信,使用AndroidNDK进行编译,并将其作为插件包含到Unity3d项目中? 我怎么能写中间层比? 我是否需要使用UnityPlayer而不是“Activity”作为基类,为什么?

捕获在Android上运行的本机代码引发的exception

我目前正在进行的项目需要我编写跨平台程序实现的android部分。 我的应用程序通过android-ndk构build了一套核心function。 我发现,在本地代码中发生的任何exception/崩溃只能一次又一次地报告。 发生错误时,出现以下某种行为: 发生堆栈跟踪/内存转储并写入日志文件。 该程序消失(没有迹象表明,为什么突然,应用程序不再在那里)。 没有堆栈跟踪/转储或其他指示,本机代码崩溃。 程序消失。 java代码崩溃,出现NullPointerExceptionexception(通常在每个本地代码exception的地方,这是一个巨大的痛苦)。 通常会导致我花费相当长的时间来debugging为什么Java代码抛出一个错误只发现Java代码是好的,本机代码错误已被完全掩盖。 我似乎无法find任何方法来“绝缘”我的代码与本地代码中发生的错误。 Try / catch语句被完全忽略。 除了当我的代码被指责为罪魁祸首,我甚至没有机会警告用户,而不是发生错误。 有人可以帮我解决如何应对崩溃的本地代码的情况?

我可以通过JNI从Node.js调用Java吗?

我可以通过JNI从Node.js调用Java吗? 有没有例子?