ndk构build和.so文件创buildandroid

我是新的android ndk。

我正在开发一个需要java代码以及c / c ++代码的应用程序

所以,为此我需要android ndk。

但我坚持在这一点上,我不能运行ndk-build,这使得java和c / c + +之间的连接。

所以。 请有人帮我解决这个问题。

我试过在Windows和Linux,但得到同样的错误。

当我使用ndk-build时,我得到这个错误。

/home/kamal/android-ndk-r8e/build/core/add-application.mk:128: Android NDK: Compile thumb : ndk <= native.c jni/native.c: In function 'Java_com_example_demo_MainActivity_hello': jni/native.c:4:3: error: parameter name omitted jni/native.c:4:3: error: parameter name omitted jni/native.c:5:10: error: 'env' undeclared (first use in this function) jni/native.c:5:10: note: each undeclared identifier is reported only once for each function it appears in jni/native.c: In function 'Java_com_example_demo_MainActivity_add': jni/native.c:9:3: error: parameter name omitted jni/native.c:9:3: error: parameter name omitted jni/native.c:9:3: error: parameter name omitted jni/native.c:9:3: error: parameter name omitted jni/native.c:10:9: error: 'value1' undeclared (first use in this function) jni/native.c:10:18: error: 'value2' undeclared (first use in this function) make: *** [obj/local/armeabi/objs/myjni/native.o] Error 1 

Solutions Collecting From Web of "ndk构build和.so文件创buildandroid"

首先你得到这个错误是因为你没有声明参数是必须在java和c / c ++之间创build连接。

所以,我发给你我的代码,你的问题

首先在eclipse中创buildandroid项目。

  1. 在项目中创build文件夹点击 – >点击新build – >然后文件夹并命名为jni。

  2. 在jni命名包含下创build多个文件夹。

  3. 创buildjava类。

  4. java class nameing的代码 – (MainActivity.java) – >

      package com.example.ndk; import android.os.Bundle; import android.app.Activity; import android.view.Menu; public class MainActivity extends Activity { static { System.loadLibrary("myjni"); } /** * Adds two integers, returning their sum */ public native int add( int v1, int v2 ); /** * Returns Hello World string */ public native String hello(); @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } } 
  5. 打开命令提示符或按窗口+ R。

  6. 移动到directory-(workspace-> project name – > jni – > include)。

  7. 在这个目录下运行命令。

      javah -classpath <project-name>/bin/classes;<ANDROID_SDK_HOME>\platforms\android-<xx>\android.jar -o HelloJNI.h com.example.test.MainActivity 
  8. 在此之后,我们可以看到包含文件夹下的“HelloJNI.h”文件。

  9. 检查“HelloJNI.h”中有这条线

     JNIEXPORT jint JNICALL Java_com_example_ndk_MainActivity_add(JNIEnv *, jobject, jint, jint); JNIEXPORT jstring JNICALL Java_com_example_ndk_MainActivity_hello (JNIEnv *, jobject); 
  10. 在jni命名test.c下创build一个新文件(在这个文件test.c中使用这两点在第10行)

      #include <jni.h> #include "include/HelloJNI.h" JNIEXPORT jstring JNICALL Java_com_example_ndk_MainActivity_hello (JNIEnv *env, jobject javaThis) { return (*env)->NewStringUTF(env, "Hello"); } JNIEXPORT jint JNICALL Java_com_example_ndk_MainActivity_add (JNIEnv *env, jobject javaThis, jint value1, jint value2){ return (value1 + value2); } 
  11. 在jni命名Android.mk下创build新文件

     LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := myjni // from point 5 LOCAL_SRC_FILES := test.c //from point 10 that we creare test.c include $(BUILD_SHARED_LIBRARY) 
  12. 创build新文件NDKActivity.java

      package com.example.ndk; import android.app.Activity; import android.view.View.OnClickListener; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; public class NDKActivity extends Activity{ Button buttonCalc; TextView result; EditText value1,value2; /** Called when the activity is first created. */ MainActivity nativeLib; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); nativeLib = new MainActivity(); String helloText = nativeLib.hello(); result = (TextView) findViewById(R.id.result); value1 = (EditText) findViewById(R.id.value1); value2 = (EditText) findViewById(R.id.value2); // Update the UI TextView outText = (TextView) findViewById(R.id.textOut); outText.setText(helloText); // Setup the UI buttonCalc = (Button)this.findViewById(R.id.buttonCalc); buttonCalc.setOnClickListener(new OnClickListener() { public void onClick(View v) { int v1, v2, res = -1; v1 = Integer.parseInt(value1.getText().toString().trim()); v2 = Integer.parseInt(value2.getText().toString().trim()); res = nativeLib.add(v1, v2); result.setText(new Integer(res).toString()); } }); } } 
  13. 在命令Promt中运行ndk-build

转到项目目录 – >然后,写下这个命令<android-ndk-directory>\ndk-build.cmd然后回车

之后我们可以检查obj文件夹下的.so文件

  1. NDKActivity的xml文件。

      <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Vikram" android:textSize="22sp"/> <TextView android:id="@+id/textOut" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Output"/> <EditText android:id="@+id/value1" android:layout_width="fill_parent" android:layout_height="wrap_content" android:hint="Value 1" android:inputType="numberDecimal" /> <TextView android:id="@+id/TextView01" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="+" android:textSize="36sp" /> <EditText android:id="@+id/value2" android:layout_width="fill_parent" android:layout_height="wrap_content" android:hint="Value 2" android:inputType="numberDecimal" /> <Button android:id="@+id/buttonCalc" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="=" /> <TextView android:id="@+id/result" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="result" android:textSize="36sp" /> </LinearLayout> 

这似乎是在.h文件和.cpp文件中的function不匹配。 你已经在.h文件中提到了函数中的一些参数,这些参数在native.cpp文件中的实现中缺less。