Articles of jni

找不到Javah错误android.app.Activity

我正在尝试为简单的NDK项目创建一个.h头文件。 使用cygwin我浏览到myprojectDIR\jni目录,然后执行以下命令: javah -o com_myproject_MyActivity.h -classpath myprojectDIR\bin\classes com.myproject.MyActivity 然后出现此错误消息: Error: cannot access android.app.Activity class file for android.app.Activity not found 我在MyActivity类中有一个本机方法,所以我尝试创建一个名为NativeAccess的新类(不扩展android SDK中的任何类)并且它工作正常,.h文件已创建,ndk-build和测试在设备上成功了! 所以我的问题是我需要在我创建的android活动和服务中使用我的本机方法,但我不能这样做,因为Javah命令无法从android-sdk本身内部访问类。 请注意我正在使用(Windows-7 x64),我有这些环境variables: ANDROID_NDK : C:\Android\android-ndk-r7b ANDROID_SDK : C:\Android\android-sdk ANT_HOME : C:\ANT\apache-ant-1.8.3 JAVA_HOME : C:\Program Files\Java\jdk1.7.0_02 PATH : %JAVA_HOME%\bin;%ANDROID_SDK%\tools;%ANDROID_SDK%\platform-tools;%ANDROID_NDK%;%ANT_HOME%\bin; (other unrelated stuff) 提前致谢

尽可能快地从C填充Android位图中的数据

我设法创建了一个android.graphics.Bitmap,我通过SetPixels命令成功填充它。 问题是我从RGBA数据开始。 然后我创建了一个jintArray。 然后我调用SetIntArray(有效地将数据memcpying到缓冲区)。 然后,最后,我调用setPixels来实际设置像素(这可能会导致另一个副本)。 这样做的一个大问题是,无论我使用R8G8B8A8还是R5G6B5或A8,我仍然需要将我的像素数据转换为R8G8B8A8数据。 理想情况下,我想要一种只使用一个副本填充缓冲区的方法,并允许我在不进行像素格式转换的情况下完成。 有没有办法直接获取位图中包含的缓冲区数据? 我看到JNI中有一个函数Ge​​tDirectBufferAddress,但是我可以在其上find的文档表明它仅限于java.nio.buffer。 我可以使用此function直接获取像素数据吗? 也许通过获取Bitmap类使用的内部缓冲区? 我唯一的方法是使用它来创建Global Ref’d Java.nio.buffer然后每次我想要更新,将我的像素数据复制到其中,然后使用copyPixelsFromBuffer? 这仍然涉及2个副本,但至少可以消除像素格式的变化。 这比我已经使用的方法更有效吗? 有没有更好的方法呢? 顺便说一句,我知道我可以使用中的函数,但我真的不想失去对Android 2.1和Android 2.2的支持…… 提前干杯!

使用JNI将android.content.Context参数发送到函数

我正在尝试创建一个方法来检查需要Context参数的Internet连接。 JNIHelper允许我用参数调用静态函数,但我不知道如何“检索”Cocos2d-x Activity类以将其用作参数。 public static boolean isNetworkAvailable(Context context) { boolean haveConnectedWifi = false; boolean haveConnectedMobile = false; ConnectivityManager cm = (ConnectivityManager) context.getSystemService( Context.CONNECTIVITY_SERVICE); NetworkInfo[] netInfo = cm.getAllNetworkInfo(); for (NetworkInfo ni : netInfo) { if (ni.getTypeName().equalsIgnoreCase(“WIFI”)) if (ni.isConnected()) haveConnectedWifi = true; if (ni.getTypeName().equalsIgnoreCase(“MOBILE”)) if (ni.isConnected()) haveConnectedMobile = true; } return haveConnectedWifi || haveConnectedMobile; } 和c ++代码是 […]

如何在Android Studio 2.2 Preview 1中正确使用NDK-Build

Android Studio 2.2 Preview 1有一个新的外部ndk构建function,但是从官方博客文章中显示的app/build.gradle片段中根本不清楚如何设置Application.mk文件通常包含的其他ndk构建参数 我可以通过externalNativeBuild设置Android.mk ndk构建文件,但是如何设置所需的Application.mkvariables呢? 我的Application.mk包含: NDK_TOOLCHAIN_VERSION := clang APP_PLATFORM := android-16 APP_ABI := armeabi APP_STL := c++_static APP_CPPFLAGS += -std=c++11

Unity中的回调监听器 – 如何从Android中的UnityPlayerActivity调用脚本文件方法

我有一个android库项目,并在Unity项目中导入了库项目。 现在,我想在Unity项目中实现一个回调,它将根据android库项目给出的响应执行。 我的意思是说,来自UnityPlayerActivity(Android Project)的Call Script File方法。 目前我使用下面的代码行,但没有任何反应: UnityPlayer.UnitySendMessage(“Main Camera”,”showMessage”,errorMessage); Main Camera是我的游戏对象。 showMessage是脚本文件中的消息名称。 Message是将通过Android Activity在Unity中显示的消息。 请检查我的下面代码Unity Script File和Android Activity。 Unity脚本文件: using UnityEngine; using System.Collections; public class scriptfile : MonoBehaviour { // Use this for initialization void Start () { AndroidJavaClass jc = new AndroidJavaClass(“com.unity3d.player.UnityPlayer”); AndroidJavaObject jo = jc.GetStatic(“currentActivity”); jo.Call(“shareText”,”236″,”236″); } void showMessage(string message){ print (“hello”); Debug.Log […]

如何在Eclipse中有效地调试用JNI包装的C代码? (Android Dev)

我有一个段错误,但我完全不知道如何find它。 提示?

Android NDK溢出dalvik JNI本地参考表

我有以下问题,从c ++我发送巨大的字符串[]到java。 巨大的=最多20行; 我正在做以下事情 jint jtype = 2; jstring emptyString = env->NewStringUTF(“”); jobjectArray data = (jobjectArray)env->NewObjectArray(7, env->FindClass(“java/lang/String”), emptyString); env->SetObjectArrayElement( data,0,env->NewStringUTF(item->get_id().c_str()); env->SetObjectArrayElement( data,1,env->NewStringUTF(item->get_number().c_str()); env->SetObjectArrayElement( data,2,env->NewStringUTF(item->get_fullname().c_str()); env->SetObjectArrayElement( data,3,env->NewStringUTF(item->get_mf().c_str()); env->SetObjectArrayElement( data,4,env->NewStringUTF(item->get_dob().c_str()); env->CallVoidMethod(dao, jsaveItem, data, jtype); int i; for (i = 0; i GetObjectArrayElement(data, i); env->DeleteLocalRef(string); } env->DeleteLocalRef(emptyString); env->DeleteLocalRef(data); env->DeleteLocalRef(dao); 这是在一个循环中发生的所以我正在为我想要保存在数据库中的每个对象执行它,所以你可以想象,它发生了很多次。 所以我很考虑VM并删除我创建的每个字符串的本地引用,但我仍然得到: ReferenceTable overflow (max=512) Last 10 entries in […]

没有JNI_OnLoad发现跳过init>应用程序关闭

伙计们, 我正在开发一个Android应用程序,我需要第三方.so库。 我根据他们的指示构建了这个第三方库(使用ndk-build),然后将其包含在我的Android项目中。 因此,我按照docs / PREBUILTS.html中描述的步骤操作,并在jni / prebuilt目录中成功构建新的.so。 现在我尝试在一个简单的测试Android应用程序中使用它来利用.so工具。 所以我做的是: static { Log.i(“load so > “,”load so”); System.loadLibrary(“xyz”); } /* The native functions */ private static native int openFile(String filename); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); try{ String path = getPathForDownloadDirectoryFile(); Log.i(“file path> “, path); int num= openFile(path); }catch(Exception e){ Log.e(“>”, “could not open […]

在包含下划线的Android包名称中调用JNI函数

我正在尝试使用LAME库在Android中实现MP3编码遵循以下指南: Lame MP3 Encoder编译为Android http://developer.samsung.com/android/technical-docs/Porting-and-using-LAME-MP3-on -Android与- JNI 但是我得到了一个java.lang.UnsatisfiedLinkError,我认为可能是因为我的包名包含一个下划线,它将其解释为句号。 看下面我的代码可能是这个问题,我该如何解决这个问题。 或者是否有其他原因导致这种情况。 在此先感谢您的帮助。 Record.java : package co.uk.ing_simmons.aberdeensoundsites; public class Record extends Activity implements OnClickListener { static { System.loadLibrary(“mp3lame”); } private native void initEncoder(int numChannels, int sampleRate, int bitRate, int mode, int quality); private native void destroyEncoder(); private native int encodeFile(String sourcePath, String targetPath); […..] } wrapper.c : […]

Android – 加载库失败

我对这个问题有类似的问题,但略有不同。 我编译了一个.so库来与JNI一起使用。 因为它很大(15 MB),所以我把它放在SDCard而不是标准的应用程序中。 该文件名为libSample.so,位于/data/library/libSample.so 我将它加载到静态初始化块中: try { File sdcard = Environment.getExternalStorageDirectory(); File libraryLoc = new File(sdcard.getAbsolutePath() + “/library/libSample.so”); Log.i(“Library”, “Does the library exist?” + libraryLoc.exists()); System.load(libraryLoc.getAbsolutePath()); } catch (UnsatisfiedLinkError e) { Log.e(“Translator”, e.getMessage()); Log.e(“Translator”, e.toString()); } 这是相关的logcat输出: 09-02 16:42:58.882: DEBUG/dalvikvm(4185): Trying to load lib /data/data/com.example.hellojni/lib/libhello-jni.so 0x434fb6f8 09-02 16:42:58.892: DEBUG/dalvikvm(4185): Added shared lib /data/data/com.example.hellojni/lib/libhello-jni.so 0x434fb6f8 […]